主要就是模拟
#include<bits/stdc++.h>
using namespace std;
int n,tp[200010],a[200010],tmp;
char s[100010];
void change(long long x)
{
memset(a,0,sizeof(a));
x%=tmp;
int p1=(-x+tmp)%tmp,p2=x;
for(int i=1;i<=tmp;i++)
a[i]=tp[i];
for(int i=1;i<=tmp;i++)
{
p1++;
if(p1>tmp)
p1=1;
p2++;
if(p2>tmp)
p2=1;
tp[i]=a[p1]^a[p2];
}
}
long long T;
int main()
{
cin>>T>>n;
scanf("%s",s+1);
for(int i=1;i<=n;i++)
a[i]=s[i]-'0';
tp[++tmp]=0;
for(int i=1;i<=n;i++)
tp[++tmp]=a[i];
tp[++tmp]=0;
for(int i=n;i;i--)
tp[++tmp]=a[i];
for(long long i=60;i>=0;i--)
{
if(T>=((long long)1<<i))
{
T-=((long long)1<<i);
change((long long)1<<i);
}
}
for(int i=2;i<=n+1;i++)
printf("%d",tp[i]);
return 0;
}
来源:zr