fi,j=fi−1,j−1⊕fi−1,j+1,其中⊕\oplus⊕表示异或
不难推出结论:
f [i] [j]
=f[ i− 2^k ] [j−2^k ] ⊕ f[ i− 2^k ] [j+2^k ];
#include<bits/stdc++.h>
#define bug(x) cout<<#x<<" == "<<x<<endl;
#define ll long long
using namespace std;
const int maxn=4e3+10;
int a[2][maxn] = { 0 };///用滚动数组来存状态
int main()
{
int n;
scanf("%d",&n);
ll T;
scanf("%lld",&T);
getchar();
string b;
cin>>b;
for(int i=0; i<n; i++)
{
a[0][i]=b[i]-'0';
}
int p = 0;
for(int k=0;k<=64;k++)
{
if(T&(1ll<<k))
{
ll pl = (1ll<<k)%n;
ll pr = (n-pl)%n;
for(int i=0;i<n;i++)
{
a[p^1][i] = a[p][pl]^a[p][pr];
pl++;
pr++;
if( pl>=n )pl -= n;
if( pr>=n )pr -= n;
}
p^=1;
}
}
for(int i=0;i<n;i++)
{
printf("%d",a[p][i]);
}
printf("\n");
}