标签:while cst i++ emc efi queue ons 快速 preview
题意:给定整数n,求Fib[n]mod10000。0≤n≤2∗10^9
思路:[fn,fn+1]=[fn-1,fn]*[{0,1},{1,1}];递推一下就得到 [fn,fn+1]=[0,1]*([{0,1},{1,1}]^n)。
故用矩阵快速幂去求。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<map> #include<vector> #define ll long long using namespace std; const int mod=10000; ll n; void mul(int f[2],int a[2][2]) { int c[2]; memset(c,0,sizeof(c)); for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { c[i]=(c[i]+(ll)f[j]*a[j][i])%mod; } } memcpy(f,c,sizeof(c)); } void mulself(int a[2][2]) { int c[2][2]; memset(c,0,sizeof(c)); for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { for(int k=0;k<2;k++) c[i][j]=(c[i][j]+(ll)a[i][k]*a[k][j])%mod; } } memcpy(a,c,sizeof(c)); } int main() { while(~scanf("%lld",&n)) { if(n==-1) break; int f[2]={0,1}; int a[2][2]={{0,1},{1,1}}; while(n) { if(n&1) { mul(f,a); } mulself(a); n>>=1; } printf("%d\n",f[0]); } }
标签:while cst i++ emc efi queue ons 快速 preview
原文地址:https://www.cnblogs.com/2462478392Lee/p/11309123.html