矩阵快速幂+优化LA3704(uva1386)
2014-06-26 10:44
330 查看
根据题意可以构造出矩阵:A(假设d=1)
1 1 0 0 ... 1
1 1 1 0 ... 0
0 1 1 1 ... 0
...
然后矩阵快速幂就可以解了,但是这个题的规模是500的,如果直接三重for循环会超时,观察矩阵可以发现,这个矩阵是有特点的,所以可以只保存一行,然后就是O(n^2*logk)的复杂度,就可以A了。
下面是代码:
1 1 0 0 ... 1
1 1 1 0 ... 0
0 1 1 1 ... 0
...
然后矩阵快速幂就可以解了,但是这个题的规模是500的,如果直接三重for循环会超时,观察矩阵可以发现,这个矩阵是有特点的,所以可以只保存一行,然后就是O(n^2*logk)的复杂度,就可以A了。
下面是代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=550; int n,m,d,k; int f[maxn]; struct Matrix { int mat[maxn]; Matrix(){memset(mat,0,sizeof(mat));} Matrix operator*(const Matrix & a)const { Matrix res; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { res.mat[i]=((long long)res.mat[i]+(long long)mat[j]*a.mat[(i-j+n)%n])%m; } return res; } }; Matrix pow_mul(Matrix a,int x) { Matrix res; res.mat[0]=1; while(x) { if(x&1)res=res*a; a=a*a; x>>=1; } return res; } int main() { while(scanf("%d%d%d%d",&n,&m,&d,&k)!=EOF) { for(int i=0;i<n;i++)scanf("%d",&f[i]); Matrix A; A.mat[0]=1; for(int i=1;i<=d;i++)A.mat[i%n]=1; for(int i=1;i<=d;i++)A.mat[(-i+n)%n]=1; A=pow_mul(A,k); Matrix tmp; for(int i=0;i<n;i++)tmp.mat[i]=f[i]; A=A*tmp; printf("%d",A.mat[0]); for(int i=1;i<n;i++)printf(" %d",A.mat[i]); printf("\n"); } return 0; }
相关文章推荐
- UVA - 1386 Cellular Automaton (矩阵快速幂)
- Power of Matrix UVA - 11149(矩阵快速幂+二分或许叫倍增优化)
- UVA1386 快速矩阵幂 O(n²logk)
- Cellular Automaton UVA - 1386 矩阵快速幂 & 循环矩阵
- UVa 10870 Recurrences / 矩阵快速幂
- Uva 10655 已知a+b,ab 求a^n+b^n 矩阵快速幂
- uva 10655 Algebraic Problem(矩阵快速幂)
- UVA 10870 Recurrences 矩阵快速幂
- uva 11992 快速矩阵操作
- uva 11885 - Number of Battlefields(矩阵快速幂)
- UVA 10518 - How Many Calls?(斐波那契矩阵快速幂)
- uva 10655 Contemplation! Algebra 矩阵快速幂
- UVA 10870 - Recurrences(矩阵快速幂)
- UVALive 6184_One-Dimensional Cellular Automaton(矩阵快速幂)
- Uva 10870 Recurrences 解题报告(矩阵快速幂)
- (十进制快速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
- UVa 10870 - Recurrences 矩阵快速幂
- hdu-4471-Homework-矩阵快速幂+优化加速
- UVa 10229 Modular Fibonacci (矩阵快速幂求斐波那契)
- uva 10870 Recurrences(矩阵优化递推)