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有大大的动静

Tossim仿真Blink 02 获取变量值

IOT实战案例--ESP32开发板跑通Arduino环境blink.....

css可以让网页文字闪烁吗?

官宣!阿里Blink和Flink合并计划出炉

这一年多来,阿里Blink测试体系如何从0走向成熟?