#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|
*/