[bzoj5118]Fib数列2_费马小定理_矩阵乘法
Posted shurak
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj5118]Fib数列2_费马小定理_矩阵乘法相关的知识,希望对你有一定的参考价值。
Fib数列2 bzoj-5118
题目大意:求Fib($2^n$)。
注释:$1le nle 10^{15}$。
想法:开始一看觉得一定是道神题,多好的题面啊?结果...妈的,模数是质数,费马小定理就tm完事了,将fib数列的通项公式列出来然后费马小定理...
最后,附上丑陋的代码... ...(照着郭爷一顿瞎jb敲)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define mod 1125899839733759 typedef long long ll; inline ll mul(ll x,ll y,ll p) { ll ans=0; while(y) { if(y&1) ans=(ans+x)%p; x=(x+x)%p,y>>=1; } return ans; } inline ll pow(ll x,ll y,ll p) { ll ans=1; while(y) { if(y&1) ans=mul(ans,x,p); x=mul(x,x,p),y>>=1; } return ans; } struct data { ll v[2][2]; data(){memset(v,0,sizeof(v));} ll*operator [] (int a){return v[a];} data operator * (data a) { data ans; int i,j,k; for(i=0;i<2;i++) for(k=0;k<2;k++) for(j=0;j<2;j++) ans[i][j]=(ans[i][j]+mul(v[i][k],a[k][j],mod))%mod; return ans; } data operator^(ll y) { data x=*this,ans; ans[0][0]=ans[1][1]=1; while(y) { if(y&1)ans=ans*x; x=x*x,y>>=1; } return ans; } }A; int main() { int T; scanf("%d",&T); while(T--) { ll n; scanf("%lld",&n),n=pow(2,n,mod-1); A[0][0]=0,A[0][1]=A[1][0]=A[1][1]=1,A=A^n; printf("%lld ",A[1][0]); } return 0; }
小结:好题
以上是关于[bzoj5118]Fib数列2_费马小定理_矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章