P8763 [蓝桥杯 2021 国 ABC] 异或变换
首先看到异或还有
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,t,a[10010];
string s;
signed main()
{
cin>>n>>t>>s;
for(int i=1;i<=n;i++)a[i]=s[i-1]-'0';
while(t--)
{
for(int i=n;i>1;i--)a[i]^=a[i-1];//倒着改可以避免异或时用了已修改的数的情况
for(int i=1;i<=n;i++)cout<<a[i];
cout<<'\n';
}
return 0;
}
我们可以代几组数据试一下。我先是测了:
5 10
11010
然后发现在第
5 40
11010
发现循环节相同,再测了几组
接着我们测 原神启动 AC。
代码十分的简短:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,t,a[10010];
string s;
signed main()
{
cin>>n>>t>>s;
for(int i=1;i<=n;i++)a[i]=s[i-1]-'0';
int l=log2(n);
if(pow(2,l)!=n)l++;
l=pow(2,l);
t%=l;//循环节长度为l,只用考虑取余后的部分
while(t--)
{
for(int i=n;i>1;i--)a[i]^=a[i-1];
}
for(int i=1;i<=n;i++)cout<<a[i];
return 0;
}