Codevs_P1250 Fibonacci数列(矩阵快速幂)
2016-01-30 22:08
239 查看
时间限制: 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
空间限制: 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
#include<cstdio> #include<vector> #include<iostream> using namespace std; typedef vector<int> vec; typedef vector<vec> mat; int n,p; mat mul(mat &A,mat &B){ mat C(A.size(),vec(B[0].size())); for(int i=0;i<A.size();i++) for(int k=0;k<B.size();k++) for(int j=0;j<B[0].size();j++) C[i][j]=(C[i][j]+A[i][k]*B[k][j])%p; return C; } mat pow(mat A,int n){ mat B(A.size(),vec(A.size())); for(int i=0;i<A.size();i++) B[i][i]=1; while(n>0){ if(n&1) B=mul(B,A); A=mul(A,A); n>>=1; } return B; } void solve(){ mat A(2,vec(2)); A[0][0]=1,A[0][1]=1; A[1][0]=1,A[1][1]=0; A=pow(A,n+1); printf("%d\n",A[1][0]); } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&p); solve(); } return 0; }
相关文章推荐
- SGI STL源码下载地址
- 配置Tomcat使用Redis作为session管理
- BestCoder Round #70
- 解决Spring Security 表单上传文件CSRF失效的问题
- 239,eclipse 中xml之智能提示
- ubuntu修改hostname
- 添加右键菜单命令 在此处打开命令窗口(E)(带图标)
- JavaScript_Math
- Blog Start
- 推荐5个非常酷的医疗健康APP
- HDU 1010 Tempter of the Bone
- mysql函数大全
- 约数倍数选卡片 博弈论
- C# 滚动条应用总结
- nyoj242
- Nano
- 判断字符串是否为格式正确的数字的方法
- SQL SERVER中的OLEDB等待事件
- C 结构体使用汇总
- 部署OpenStack问题汇总(六)-- OpenStack入门需要知道的概念