P1939 【模板】矩阵加速(数列)
2017-08-16 20:53
225 查看
传送门
根据题目的意思,还有瞎jb凑,凑出来这个矩阵
|f
,f[n-1],f[n-2]|=|f[n-1],f[n-2],f[n-3]|*|1,0,1,|
|1,0,0|
|0,1,0|
还是老套路矩阵快速幂就可以AC辣
根据题目的意思,还有瞎jb凑,凑出来这个矩阵
|f
,f[n-1],f[n-2]|=|f[n-1],f[n-2],f[n-3]|*|1,0,1,|
|1,0,0|
|0,1,0|
还是老套路矩阵快速幂就可以AC辣
#include <cstdio> #include <iostream> #include <cstring> #define ll long long using namespace std; const int p=1e9+7; ll ans[2][4]; ll x[4][4]; ll dx[4][4]; void init() { memset(ans,0,sizeof(ans)); memset(x,0,sizeof(x)); ans[1][1]=1,ans[1][2]=1,ans[1][3]=1; x[1][1]=1,x[1][3]=1,x[2][1]=1,x[3][2]=1; } void ans_cf() { for(int i=1;i<=3;i++) dx[1][i]=ans[1][i],ans[1][i]=0; for(int i=1;i<=1;i++) for(int j=1;j<=3;j++) for(int k=1;k<=3;k++) ans[i][j]=(ans[i][j]+(dx[i][k]*x[k][j])%p)%p; } void x_cf() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) dx[i][j]=x[i][j],x[i][j]=0; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) for(int k=1;k<=3;k++) x[i][j]=(x[i][j]+(dx[i][k]*dx[k][j])%p)%p; } void fast_pow(int k) { while(k) { if(k%2) ans_cf(); k/=2; x_cf(); } } int main() { ll n; scanf("%lld",&n); while(n--) { init(); ll w; scanf("%lld",&w); if(w<=3) { printf("1\n"); continue; } fast_pow(w-3); printf("%lld\n",ans[1][1]%p); } return 0; }
相关文章推荐
- P1939 【模板】矩阵加速(数列)
- P1939 【模板】矩阵加速(数列)
- P1939【模板】矩阵加速(数列)
- P1939 【模板】矩阵加速(数列)
- 洛谷 P1939 【模板】矩阵加速(数列):优化递推式的方法——矩阵快速幂
- 洛谷P1939 【模板】矩阵加速(数列)
- 洛谷 1939 【模板】矩阵加速(数列)
- luogu P1939 【模板】矩阵加速(数列)
- luogu P1939 【模板】矩阵加速(数列)
- 【模板】矩阵加速(数列)
- 洛谷1939 【模板】矩阵加速(数列)
- 矩阵乘法加速fib数列
- [模板]矩阵加速
- ACdream 1116 扩展KMP 线段树区间累加 Fib数列的矩阵加速
- 矩阵快速幂/矩阵加速线性数列 By cellur925
- 多校第十场 HDU 3936 FIB Query(fibonacci 数列的性质 ,及Ologn 矩阵加速乘算法)
- 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】
- 矩阵加速数列递推
- 模板 大数的斐波那契额数列(可以用来求大数加法)
- 一个我自己写的矩阵快速幂模板