codevs1250 Fibonacci数列 感觉没有比这再傻逼的题了
题目描述 Description
定义:f0=f1=1, fn=fn-1+fn-2(n>=2)。{fi}称为Fibonacci数列。
输入n,求fn mod q。其中1<=q<=30000。
输入描述 Input Description
第一行一个数T(1<=T<=10000)。
以下T行,每行两个数,n,q(n<=109, 1<=q<=30000)
输出描述 Output Description
文件包含T行,每行对应一个答案。
样例输入 Sample Input
3
6 2
7 3
7 11
样例输出 Sample Output
1
0
10
数据范围及提示 Data Size & Hint
1<=T<=10000
n<=109, 1<=q<=30000
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 long long table[2][2],a[2][2],h[2][2]; 6 int q; 7 void fang() 8 { int i,j,k; memset(a,0,sizeof(a)); 9 for (i=0;i<=1;++i) 10 for (j=0;j<=1;++j) 11 for (k=0;k<=1;++k) 12 a[i][j]=(a[i][j]+table[i][k]*table[k][j])%q; 13 } 14 void chengxa() 15 { int i,j,k; memset(h,0,sizeof(h)); 16 table[0][0]=0;table[0][1]=1;table[1][0]=1;table[1][1]=1; 17 for (i=0;i<=1;++i) 18 for (j=0;j<=1;++j) 19 for (k=0;k<=1;++k) 20 h[i][j]=(h[i][j]+table[i][k]*a[k][j])%q; 21 for (i=0;i<=1;++i) for (j=0;j<=1;++j) table[i][j]=h[i][j]; 22 } 23 void changeback() 24 { int i,j; 25 for (i=0;i<=1;++i) for (j=0;j<=1;++j) table[i][j]=a[i][j]; 26 } 27 void cheng(int x) 28 { 29 if (x<=1) return; 30 cheng(x/2); 31 fang(); 32 if (x%2==1) chengxa(); 33 else changeback(); 34 } 35 int main() 36 { 37 int t,n; long long ans; 38 scanf("%d\n",&t); 39 while (t>0){t--; 40 scanf("%d %d\n",&n,&q); 41 table[0][0]=0;table[0][1]=1;table[1][0]=1;table[1][1]=1; 42 cheng(n); 43 printf("%lld\n",table[1][1]); 44 } 45 return 0; 46 }

浙公网安备 33010602011771号