我们来分析一下对灯的操作
1.对所有灯的,这时吧所有灯看成一个整体
2.奇偶数的操作,这时可以把每两个数看成一个循环节
3.对3X+ 1的操作,这时可以把每三个数看成一个循环节
显而易见的,我们把序列看成6个一组的循环节,便能模拟整个序列。
用笔画一下,我们发现将这个含六个元素的序列进行变换最终只会有八种结果,那么我们只需要判断一下最后这八种结果
最后是否符合题意要求就行了(至于他是怎么变换的我们不用管)
以上就是在题解区找到的解释,其实说得很好,希望原作者 见谅。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 using namespace std; 3 const int N = 1e3+10; 4 int One[N],Zero[N],cnt1,cnt2; 5 int n,C; 6 int a[N][16]; 7 string S[100]; 8 char s[N]; 9 void Init(){10 for(int i=0;i >n>>C;37 while( cin>>One[cnt1++] ){38 if(One[cnt1-1]==-1){39 cnt1--; break;40 }41 }42 while( cin>>Zero[cnt2++] ){43 if(Zero[cnt2-1]==-1){44 cnt2--; break;45 }46 }47 /*48 for(int i=0;i >1) & 1 ){62 for(int j=1;j<=n;j+=2){63 a[j][i] = a[j][i] ^ 1 ;64 }65 }66 if( (i>>2) & 1 ){67 for(int j=2;j<=n;j+=2){68 a[j][i] = a[j][i] ^ 1 ;69 }70 }71 if( (i>>3) & 1 ){72 for(int j=1;j<=n;j+=3){73 a[j][i] = a[j][i] ^ 1 ;74 }75 }76 }77 int cnt = 0 ;78 79 for(int j=0;j<=15;j++){80 if( check(j) ) {81 for(int i = 1 ; i <= n; i++){82 s[i-1] = a[i][j] + '0';83 }84 s[n] = '\0';85 S[cnt++] = s;86 }87 }88 if( cnt == 0 ){89 cout<<"IMPOSSIBLE"<