P1939 【模板】矩阵加速(数列)
2018-02-07 19:13
363 查看
题目描述
a[1]=a[2]=a[3]=1a[x]=a[x-3]+a[x-1] (x>3)
求a数列的第n项对1000000007(10^9+7)取余的值。
输入输出格式
输入格式:第一行一个整数T,表示询问个数。
以下T行,每行一个正整数n。
输出格式:
每行输出一个非负整数表示答案。
输入输出样例
输入样例#1:3 6 8 10
输出样例#1:
4 9 19
说明
对于30%的数据 n<=100;对于60%的数据 n<=2*10^7;
对于100%的数据 T<=100,n<=2*10
Solution:
代码:
#include<bits/stdc++.h> #define il inline #define ll long long //#define debug printf("%d %s\n",__LINE__,__FUNCTION__) using namespace std; const int mod=9907; int t,n; il int gi() { int a=0;char x=getchar();bool f=0; while((x<'0'||x>'9')&&x!='-')x=getchar(); if(x=='-')x=getchar(),f=1; while(x>='0'&&x<='9')a=a*10+x-48,x=getchar(); return f?-a:a; } struct mat{ int a[5][5],r,c; }; il mat mul(mat x,mat y) { mat p; memset(&p,0,sizeof(p)); for(int i=0;i<x.r;i++) for(int j=0;j<y.c;j++) for(int k=0;k<x.c;k++) p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%mod; p.r=x.r;p.c=y.c; return p; } il void fast(int k) { mat p,ans; memset(&p,0,sizeof(p)); memset(&ans,0,sizeof(ans)); p.r=p.c=3; p.a[0][1]=p.a[1][2]=p.a[2][0]=p.a[2][1]=1; ans.r=ans.c=3; ans.a[0][0]=ans.a[1][1]=ans.a[2][2]=1; while(k){ if(k&1)ans=mul(p,ans); p=mul(p,p); k>>=1; } p.a[0][0]=1,p.a[1][0]=2,p.a[2][0]=3; p.c=1; ans=mul(ans,p); printf("%d\n",(int)ans.a[2][0]); } int main() { t=gi(); while(t--){ n=gi(); if(n<4)printf("%d\n",n); else fast(n-3); } return 0; }
相关文章推荐
- P1939 【模板】矩阵加速(数列)
- P1939【模板】矩阵加速(数列)
- P1939 【模板】矩阵加速(数列)
- P1939 【模板】矩阵加速(数列)
- 洛谷 P1939 【模板】矩阵加速(数列):优化递推式的方法——矩阵快速幂
- 洛谷 1939 【模板】矩阵加速(数列)
- 洛谷1939 【模板】矩阵加速(数列)
- luogu P1939 【模板】矩阵加速(数列)
- 洛谷P1939 【模板】矩阵加速(数列)
- 【模板】矩阵加速(数列)
- luogu P1939 【模板】矩阵加速(数列)
- 矩阵乘法加速fib数列
- 多校第十场 HDU 3936 FIB Query(fibonacci 数列的性质 ,及Ologn 矩阵加速乘算法)
- [模板]矩阵加速
- ACdream 1116 扩展KMP 线段树区间累加 Fib数列的矩阵加速
- 矩阵快速幂/矩阵加速线性数列 By cellur925
- 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】
- 矩阵加速数列递推
- HDU 3117 Fibonacci Numbers(Fibonacci矩阵加速递推+公式)
- 矩阵快速幂模板