标签:ace 整数 spl ini hide hid open 需要 return
(这不是黄题吧)
Farmer John 对于农场里昏暗的灯光很不满,于是他刚刚装上一个装饰精美的新吊灯。
这个吊灯由N(3 <= N <= 16)个灯组成,并排成一个圆圈。
奶牛们对于这个新的发光装置很有兴趣。他们喜欢玩这样的一个游戏:
在时间T时,他们会操作在时间T-1的时左边的灯是开的的灯的灯泡的开关。
他们会在B个单位的时间里一直进行这样的操作( 1 <= B <= 10^15 )
请注意,B可能会超过一般的32位整数的范围。
现在已知每一个灯的初始状态,请计算出在经过B个单位的时间后,每一个灯的状态。
输入格式:
第1行是两个整数,N和B
第2~1+N中,第i+1行描述了灯的初始状态,用0(关)与1(开)表示
输出格式:
N行,第i行应输出一个整数,描述灯的最终状态,用0(关)与1(开)表示
5 6 1 0 0 0 0
1 1 1 0 1
找循环节,但需要注意循环开头不一定在第一个,所以都要枚举(找前500就够了,多的直接输出);
如样例:
5 6
1 0 0 0 0
循环为
11000 10100 11110 10001 01001 11101 00011 10010 11011 00110 00101 10111 01100 01010 01111 11000 10100 11110 10001 01001 11101 00011 10010 11011 00110 00101 10111 01100 01010 01111 11000 10100 11110 10001 01001 11101 00011 10010 11011 00110
#include<bits/stdc++.h> using namespace std; bool flag[25]; int n,start=0,len=1,l[505][25]; long long b; void print(){for(int j=0;j<n;j++) cout<<l[(b-start)%len+start][j]<<endl;} void init(){for(int i=0;i<n;i++) cin>>l[0][i];} void compare(int a,int b) { bool f=1; for(int j=0;j<n;j++) if(l[a][j]!=l[b][j]) f=0; if(f!=0) start=a,len=b-a; } void turn(int i){for(int j=0;j<n;j++) if(flag[j]) l[i][(j+1)%n]=1-l[i][(j+1)%n];} void trans(int i){for(int j=0;j<n;j++){if(l[i-1][j]==1) flag[j]=1;l[i][j]=l[i-1][j];}} int main() { cin>>n>>b; init(); for(int i=1;i<=500;i++) { memset(flag,0,sizeof(flag)); trans(i); turn(i); for(int j=1;j<i;j++){compare(j,i);if(len>1) break;} if(i==b){for(int j=0;j<n;j++) cout<<l[b][j]<<endl;return 0;} } cout<<endl; print(); return 0; }
标签:ace 整数 spl ini hide hid open 需要 return
原文地址:https://www.cnblogs.com/GREED-VI/p/9682812.html