1250 Fibonacci数列(矩阵乘法快速幂)
2017-08-08 17:25
423 查看
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
code
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 2; int mod; struct Matrix{ int a ; Matrix(){ this->clear(); } void clear(){ memset(a,0,sizeof(a)); } void setone(){ this->clear(); for (int i=0; i<N; ++i) a[i][i] = 1; } Matrix operator * (const Matrix &x) const { Matrix c; for (int k=0; k<N; k++) for (int i=0; i<N; ++i) for (int j=0; j<N; ++j) c.a[i][j] = (c.a[i][j]+1ll*a[i][k]*x.a[k][j])%mod; return c; } }; int fibn(int n) { Matrix x,s; x.a[0][0] = x.a[0][1] = x.a[1][0] = 1; s.setone(); for (; n; n>>=1) { if (n&1) s = s*x; x = x*x; } return (s.a[0][0]+s.a[0][1])%mod; } int main() { int t,n; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&mod); n++; if (n==1||n==2) printf("%d\n",1); else printf("%d\n",fibn(n-2)); } return 0; }
相关文章推荐
- 矩阵乘法快速幂 codevs 1250 Fibonacci数列
- Fibonacci数列(矩阵乘法快速幂)
- 【codevs 1250】Fibonacci数列(矩阵快速幂)
- 【wikioi】1250 Fibonacci数列(矩阵乘法)
- [WIKIOI 1250]Fibonacci数列(数论+数学+矩阵乘法+二分快速幂)
- 1250 Fibonacci数列(矩阵乘法)
- 【codevs1250】Fibonacci数列,矩阵乘法入门
- hdu 5451 Best Solver 快速矩阵乘法 Fibonacci数列的循环节
- 矩阵乘法快速幂 codevs 1732 Fibonacci数列 2
- 【矩阵乘法】【codevs 1250】Fibonacci数列
- codevs 1250 Fibonacci数列(矩阵快速幂)
- Fibonacci数列(矩阵乘法快速幂)
- 【矩阵乘法】Fibonacci数列 WikiOI 1732/1250
- [caioj 1484及Luogu P1962,利用矩阵乘法解决的经典题目六]Fibonacci数列
- hdu 1575 Tr A(矩阵快速幂乘法优化算法)
- POJ 3233 快速矩阵乘法
- T解 POJ-3233 [矩阵快速幂][矩阵乘法][二分求解]
- 【codevs1732】Fibonacci数列 2(矩阵快速幂)
- neu1250矩阵快速幂哪~~
- srm#397_div1_500pt 矩阵乘法+快速模幂