这个问题是基于康威生命游戏的分拆。 点击here
基于作者提供的解决方案
`#include <cstdio>
#include <cstring>
int N;
long long rot(long long x, int amt){
return ((x<<amt)|(x>>(N-amt)))&((1ll<<N)-1);
}
int main(){
char in[51];
int T;
scanf("%d", &T);
while(T--){
scanf("%s", in);
N=strlen(in);
long long cur=0, orig=0;
for(int i=0; i<N; i++)
cur|=(long long)(in[i]-'0')<<i;
for(int i=0; i<N; i++)
if((i%3)!=(2*N%3))
orig^=rot(cur, i);
if((N%3)==0){
if(orig==0)
puts("Multiple solutions");
else
puts("No solution");
}else{
for(int i=0; i<N; i++)
putchar('0'+((orig>>i)&1));
putchar('\n');
}
}
return 0;
}
`
你能解释一下&#34; if&#34;条件if((i%3)!=(2*N%3))
有助于实现。
您还可以详细说明编辑[https://discuss.codechef.com/questions/4202/life-editorial?sort=oldest]中提供的第二个解决方案,因为模拟步骤(A<<<1)^A^(A>>>1)
不满足任何测试用例。