时间限制: 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
最简单的矩阵快速幂优化DP,
退出斐波那契的矩阵然后跑矩阵快速幂就好,
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 void read(int &n) 8 { 9 char c='+';int x=0;bool flag=0;10 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}11 while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();}12 flag==1?n=-x:n=x;13 }14 void Matrix_mul(int a[2][2],int b[2][2],int mod)15 {16 int c[2][2];17 memset(c,0,sizeof(c));18 for(int i=0;i<2;i++)19 for(int j=0;j<2;j++)20 for(int k=0;k<2;k++)21 c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%mod)%mod;22 for(int i=0;i<2;i++)23 for(int j=0;j<2;j++)24 a[i][j]=c[i][j];25 }26 int Matrix_fastpow(int n,int q)27 {28 int a[2][2]={ 1,1,1,0};29 int ans[2][2]={ 1,0,1,0};30 while(n)31 {32 if(n&1)33 Matrix_mul(ans,a,q);34 Matrix_mul(a,a,q);35 n>>=1;36 }37 //cout< <