HDU 3306 Another kind of Fibonacci 矩阵快速幂
生活随笔
收集整理的這篇文章主要介紹了
HDU 3306 Another kind of Fibonacci 矩阵快速幂
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
| 因為S(N) , S(N) = A(0)^2 +A(1)^2+……+A(n)^2.所以構造的矩陣一定要維護A(n)^2 |
s[n-1]=s[n-2]+A[n-1]^2
A[n]=x*A[n-1]+y*A[n-2]
A[n]^2=x^2*A[n-1]+y^2*A[n-2]+2*x*y*A[n-1]*A[n-2]
所以說還要維護A[n-1]*A[n-1]
這個遞推過來發現A[n]*A[n-1]=(x*A[n-1]+y*A[n-2])*A[n-1]=x*(A[n-1]^2)+y*A[n-1]*A[n-2]
如果還不明白 看看對應的表
| ? | A[n-1]^2 | A[n]^2 | A[n]*A[n-1] | S[n-1] |
| A[n-2]^2 | 0 | y*y | 0 | 0 |
| A[n-1]^2 | 1 | x*x | x | 1 |
| A[n-1]*A[n-2] | 0 | 2*x*y | y | 0 |
| S[n-2] | 0 | 0 | 0 | 1 |
然后我們就把對應關系列出來了
變換矩陣X就是上述4*4的表
初始矩陣ans為A[0],A[1],A[0]*A[1],S[0];
求S[n],ans=qmod(X,n);
A'C代碼:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define PI 3.14159265358979323846
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define pii make_pair
#define pr pair<int,int>
const int dir[4][2]={0,1,0,-1,1,0,-1,0};
typedef long long ll;
const ll inFF=9223372036854775807;
typedef unsigned long long ull;
using namespace std;
const ll mod=10007;
ll n,x,y;
struct mat///自己定義大小的矩陣
{ll m[4][4];
};
mat mulmat(mat A,mat B)///兩個矩陣相乘
{mat C;memset(C.m,0,sizeof(C.m));for(int i=0;i<4;i++)for(int j=0;j<4;j++)for(int k=0;k<4;k++)C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j])%mod;return C;
}
ll qmod_mat(mat A,ll b)///A為變換矩陣,b為冪
{mat ans;memset(ans.m,0,sizeof(ans.m));///給自己的初始矩陣賦值,一般初始矩陣和變換矩陣都是固定的ans.m[0][0]=ans.m[0][1]=ans.m[0][2]=ans.m[0][3]=1;while(b){if(b&1) ans=mulmat(ans,A);A=mulmat(A,A);b>>=1;}return ans.m[0][3];///最后的矩陣,答案
}
int main()
{while(cin>>n>>x>>y){mat A;memset(A.m,0,sizeof(A.m));A.m[1][0]=A.m[1][3]=A.m[3][3]=1;A.m[0][1]=y*y%mod,A.m[1][1]=x*x%mod;A.m[2][1]=2*x*y%mod;A.m[1][2]=x%mod,A.m[2][2]=y%mod;printf("%lld\n",qmod_mat(A,n));}return 0;
}
?
總結
以上是生活随笔為你收集整理的HDU 3306 Another kind of Fibonacci 矩阵快速幂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矩阵快速幂+构造方法
- 下一篇: 网络流最大流EK算法板子