bzoj4688 One-Dimensional

来源:互联网 发布:软件拆卸 编辑:程序博客网 时间:2024/05/10 02:40

【题意】略

【数据范围】n<=50,m<=1000,T<=10^9

【思路】考虑到是层层线性递推,矩阵乘法即可。

【时间复杂度】O(n^3 log T)

#include<cstdio>#include<cstring>#include<algorithm>#define N 60using namespace std;int n, mod, A, B, C, m, a[N][N], b[N][N], c[N][N], w[N], ans[N];int main(){scanf("%d%d%d%d%d%d", &n, &mod, &A, &B, &C, &m);while(n){for(int i=1; i<=n; i++)scanf("%d", &w[i]);if(!m){for(int i=1; i<=n-1; i++)printf("%d ", w[i]); printf("%d\n", w[n]);scanf("%d%d%d%d%d%d", &n, &mod, &A, &B, &C, &m);continue;}memset(a, 0, sizeof(a));for(int i=1; i<=n; i++){if(i>=2)a[i][i-1]=C; a[i][i]=B;if(i<=n-1)a[i][i+1]=A;}memcpy(b, a, sizeof(b)); a[1][1]=-1;while(m){if(m&1){if(a[1][1]==-1)memcpy(a, b, sizeof(a));else{for(int i=1; i<=n; i++)for(int j=1; j<=n; j++){c[i][j]=0;for(int k=1; k<=n; k++)c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;}memcpy(a, c, sizeof(c));}}for(int i=1; i<=n; i++)for(int j=1; j<=n; j++){c[i][j]=0;for(int k=1; k<=n; k++)c[i][j]=(c[i][j]+b[i][k]*b[k][j])%mod;}memcpy(b, c, sizeof(b));m>>=1;}for(int i=1; i<=n; i++){ans[i]=0;for(int j=1; j<=n; j++)ans[i]=(ans[i]+w[j]*a[j][i])%mod;}for(int i=1; i<=n-1; i++)printf("%d ", ans[i]); printf("%d\n", ans[n]);scanf("%d%d%d%d%d%d", &n, &mod, &A, &B, &C, &m);}return 0;}


0 0
原创粉丝点击