#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define LL long long const int mod=2; int n; struct matrix{ int f[101][101]; }; matrix mul(matrix a,matrix b) { matrix c; memset(c.f,0,sizeof(c.f)); int i,j,k; for(k=0;k<n;k++) { for(i=0;i<n;i++) { if(!a.f[i][k])continue; for(j=0;j<n;j++) { //cout<<mod<<endl; if(!b.f[k][j])continue; c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod; } } } return c; } matrix pow_mod(matrix a,int b) { matrix s; int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) s.f[i][j]=(i==j?1:0); while(b) { if(b&1) s=mul(s,a); a=mul(a,a); b=b>>1; } return s; } int main() { int m; while(cin>>m) { char s[101]; int i,j,k,a[101]; cin>>s; n=strlen(s); for(i=0;i<n;i++) a[i]=s[i]-'0'; matrix e; for(i=0;i<n;i++) for(j=0;j<n;j++) if(i==j||j==i+1)e.f[i][j]=1; else e.f[i][j]=0; e.f[n-1][0]=1; e=pow_mod(e,m); int c[101]; memset(c,0,sizeof(c)); for(i=0;i<n;i++) for(j=0;j<n;j++) c[i]=(c[i]+a[j]*e.f[j][i])%mod; for(i=0;i<n;i++) cout<<c[i]; cout<<endl; } return 0; } /* 矩阵 对于a0a1a2a3 |b0b1b2b3|=|a0a1a2a3|*|1 1 0 0|^m |0 1 1 0| |0 0 1 1| |1 0 0 1| */
这个矩阵是循环矩阵,可以用下面的代码,时间复杂度为O(n^2logm),直接的方法是O(n^3logm),少了n。虽然我提交后时间只少了一半。。
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define LL long long const int mod=2; int n,s[101]; void mul(int a[],int b[])//循环矩阵的乘法 { int i,j,c[101]; for(i=0;i<n;i++) { c[i]=0; for(j=0;j<n;j++) c[i]=(a[j]*b[(i-j+n)%n]+c[i])%mod; } memcpy(a,c,sizeof(c)); } void pow_mod(int a[],int b) { int i,j; memset(s,0,sizeof(s)); s[0]=1; while(b) { if(b&1) mul(s,a); mul(a,a); b=b>>1; } } int main() { int m; while(scanf("%d",&m)!=EOF) { char str[101]; int i,j,k,a[101],e[101],ans[101]; scanf("%s",str); n=strlen(str); for(i=0;i<n;i++) a[i]=str[i]-'0'; memset(e,0,sizeof(e)); e[0]=e[1]=1; pow_mod(e,m); for(i=0;i<n;i++) { ans[i]=0; for(j=0;j<n;j++) ans[i]=(ans[i]+a[j]*s[(i-j+n)%n])%mod; } for(i=0;i<n;i++) printf("%d",ans[i]); printf("\n"); } return 0; } /* 循环矩阵,每一层都是上一层向右移一位,可以用一个一位数组表示一个矩阵。 循环矩阵相乘还是循环矩阵 |1 1 0 0| |0 1 1 0| |0 0 1 1| |1 0 0 1| */