Fibonacci数列(codevs 1250)
2016-09-30 20:48
246 查看
题目描述 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
View Code
定义: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
/* 矩阵乘法求斐波那契数列 */ #include<cstdio> #include<iostream> #define ll long long using namespace std; ll a[3][3],b[3][3],c[3][3],ans[3][3],n,mod; void work() { b[1][1]=ans[1][1]=0; b[1][2]=ans[1][2]=1; b[2][1]=ans[2][1]=1; b[2][2]=ans[2][2]=1; while(n) { if(n&1) { for(int k=1;k<=2;k++) for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) c[i][j]=(c[i][j]+(ans[i][k]*b[k][j]%mod)%mod); for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) ans[i][j]=c[i][j],c[i][j]=0; } for(int k=1;k<=2;k++) for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) c[i][j]=(c[i][j]+(b[i][k]*b[k][j]%mod)%mod); for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) b[i][j]=c[i][j],c[i][j]=0; n/=2; } printf("%lld\n",(ans[1][1]+ans[1][2])%mod); } int main() { int T; scanf("%d",&T); while(T--) { cin>>n>>mod; if(n<=2)printf("%lld\n",n); else n--,work(); } return 0; }
View Code
相关文章推荐
- 【codevs1250】Fibonacci数列,矩阵乘法入门
- codevs 1250 Fibonacci数列
- codevs1250 Fibonacci数列
- Codevs1250 Fibonacci数列
- 【矩阵乘法】【codevs 1250】Fibonacci数列
- 矩阵乘法快速幂 codevs 1250 Fibonacci数列
- codevs 1250(矩阵快速幂)
- code vs 1732 Fibonacci数列 2
- Codevs 1250、1732 矩阵 快速幂
- codevs天梯 fibonacci数列水题
- Code Vs-problem-1978 Fibonacci数列 3
- 矩形覆盖(codevs 1101)
- 【暑假训练 7.10】 codevs 2492 上帝造题的七分钟2
- 别墅房间 CodeVS原创
- codevs 2147 数星星
- CODE[VS]2370 小机房的树
- 一塔湖图(codevs 1024)
- VS code当前设置备份
- codevs 2803 爱丽丝·玛格特罗依德
- [网络流24题][CODEVS1915]分配问题(网络流)