bzoj 2510 弱题 矩阵乘
看题就像矩阵乘
但是1000的数据无从下手
打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵
于是都可以转化为一行的,O(n3)->O(n2)*logk
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; int n,m,k,yy[1005][1005]; double ma[1005],A[1005],f[1005]; int print(double a[1005]){ for(int i=1;i<=n;i++) printf("%0.3lf\n",a[i]); } void poww(double a[1005],double b[1005],double c[1005]){ double d[1005]={0}; for(int i=1;i<=n;i++) { d[i]=0; for(int j=1;j<=n;j++) d[i]+=(double)a[j]*b[yy[j][i]]; } for(int i=1;i<=n;i++) c[i]=d[i]; } ///a[i][j]=a[1][1+(j-i+n)%n] //f[i][j]=(m-1)/(1.0*m)*f[i-1][j]+1/(1.0*m)*f[i-1][j-1]; int main() { scanf("%d%d%d",&n,&m,&k); int ii=0; for(int i=1;i<=n;i++) scanf("%lf",&f[i]); ma[1]=(m-1)/(1.0*m); ma[2]=1/(1.0*m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) yy[i][j]=1+(j-i+n)%n; A[1]=1; while(k){ if(k&1)poww(ma,A,A); poww(ma,ma,ma); k>>=1; } poww(A,f,A); print(A); return 0; }
人生如梦亦如幻 朝如晨露暮如霞。