码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu P2203 Blink

时间:2018-09-20 19:50:36      阅读:194      评论:0      收藏:0      [点我收藏+]

标签: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;
} 

 

Luogu P2203 Blink

标签:ace   整数   spl   ini   hide   hid   open   需要   return   

原文地址:https://www.cnblogs.com/GREED-VI/p/9682812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!