Luogu P2203 Blink
Posted greed-vi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P2203 Blink相关的知识,希望对你有一定的参考价值。
题面
(这不是黄题吧)
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; }
以上是关于Luogu P2203 Blink的主要内容,如果未能解决你的问题,请参考以下文章
Go语言爬取Blink评论 | 小小的Blink有大大的动静