codevs1250 Fibonacci数列 感觉没有比这再傻逼的题了

1250 Fibonacci数列

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 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 }
View Code

 

posted @ 2015-12-02 20:29  谜团跳刀刷新A杖大  阅读(330)  评论(0)    收藏  举报