[CQU 21466] zzblack与斐波那契数列 (矩阵快速幂)
2016-05-26 19:01
323 查看
CQU - 21466
求 f(⌈(5√+12)2m⌉)其中 f(n)是 Fibonacci数列的第 n项
首先要求项数,一看 m很大,肯定是快速幂
但是底数是个浮点数,肯定不能直接快速幂
所以要给底数加一个 (5√−12)2m
Am=(5√+12)2m+(5√−12)2m
可以证明Am是整数,并且 (5√−12)2m<1
所以Am就相当于原数向上取整
所以问题就转化为求 Am
给Am乘上 (5√+12)2+(5√−12)2,可以推出
Am+1=3Am−Am−1
然后用矩阵快速幂求Am就好了,然后对 Fibonacci的循环节取 mod
至于 Fibonacci数列,同样用矩阵快速幂求就好了
#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; typedef pair<int,int> Pii; typedef long long LL; typedef unsigned long long ULL; typedef double DBL; typedef long double LDBL; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Sqr(a) (a*a) const LL MOD1=2238065148, MOD2=16941960; struct Matrix { LL n[2][2]; LL mod; Matrix(LL a):mod(a){CLR(n);} void E(){CLR(n);for(int i=0; i<2; i++) n[i][i]=1;} Matrix operator * (const Matrix &v) const { Matrix res(mod); for(int i=0; i<2; i++) for(int j=0; j<2; j++) for(int k=0; k<2; k++) res.n[i][j]=(res.n[i][j] + (n[i][k]*v.n[k][j])%mod ) %mod; return res; } }; LL N; LL getT(LL); LL getF(LL); int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif int T; scanf("%d", &T); for(int ck=1; ck<=T; ck++) { scanf("%lld", &N); N=getT(N); N=getF(N); printf("%lld\n", N); } return 0; } LL getT(LL N) { if(N==0) return 1; if(N==1) return 3; if(N==2) return 7; N-=2; Matrix res(MOD2),ans(MOD2); ans.E(); res.n[0][0]=3; res.n[0][1]=-1; res.n[1][0]=1; while(N) { if(N&1) ans=res*ans; res=res*res; N>>=1; } LL tn = (7*ans.n[0][0] + 3*ans.n[0][1]) %MOD2; tn+=MOD2; return tn%MOD2; } LL getF(LL N) { if(N==0) return 1; if(N==1) return 1; N-=2; Matrix res(MOD1),ans(MOD1); ans.E(); res.n[0][0] = res.n[0][1] = res.n[1][0] = 1; while(N) { if(N&1) ans=res*ans; res=res*res; N>>=1; } return (ans.n[0][0] + ans.n[0][1]) %MOD1; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)