递推公式F(i)=f(i)^f(i-1).
在这道题目中,"^ "相当于“*”,”&&“相当于“+”,初始化false相当于0。
#include<iostream>
using namespace std;
#define MAX 103
void Mul(bool a[MAX][MAX],bool b[MAX][MAX],bool c[MAX][MAX])
{
bool sum=false;
int i,j,k;
for( i=0;i<MAX;i++)
for( j=0;j<MAX;j++)
{
sum=0;
for(k=0;k<MAX;k++)
sum^=a[i][k]&&b[k][j];
c[i][j]=sum;
}
}
void Pow(bool a[MAX][MAX],int n)
{
if(n<=1)
return;
bool b[MAX][MAX],c[MAX][MAX];
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
c[i][j]=a[i][j];
Pow(c,n/2);
if(n%2)
{
Mul(a,c,b);
Mul(b,c,a);
}
else
Mul(c,c,a);
}
int main()
{
char str[MAX];
bool b[MAX],c[MAX];
bool a[MAX][MAX];
int n,len;
int i,j,k;
while(cin>>n!=0)
{
memset(a,0,sizeof(a));
getchar();
gets(str);
len=strlen(str);
for(i=1;i<len;i++)
a[i][i]=a[i][i-1]=1;
a[0][len-1]=a[0][0]=1;
for(i=0;i<len;i++)
if(str[i]=='0')
b[i]=false;
else
b[i]=true;
Pow(a,n);
bool sum;
for(i=0;i<len;i++)
{
sum=false;
for(j=0;j<len;j++)
sum^=a[i][j]&&b[j];
c[i]=sum;
}
for(i=0;i<len;i++)
if(c[i])
cout<<"1";
else
cout<<"0";
cout<<endl;
}
return 0;
}