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
分类标签 Tags
AC代码:
#include#include #define ll long longusing namespace std;struct node{ int a[2][2];}ans,ss;int T,n,mod;inline node mul(node &a,node &b){ node c; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ c.a[i][j]=0; for(int k=0;k<2;k++){ c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod; } } } return c;}void fpow(int p){ for(;p;p>>=1,ss=mul(ss,ss)) if(p&1) ans=mul(ans,ss);}int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&mod); if(n==1){printf("%d\n",1%mod);continue;} if(n==2){printf("%d\n",1%mod);continue;} if(n==3){printf("%d\n",2%mod);continue;} ans.a[0][0]=ans.a[1][0]=1;ans.a[0][1]=ans.a[1][1]=0; ss.a[0][0]=ss.a[1][0]=ss.a[0][1]=1;ss.a[1][1]=0; fpow(n); printf("%d\n",ans.a[0][0]); } return 0;}