闪烁


题目

链接:1960. 闪烁 - AcWing题库

农夫约翰对牛棚里昏暗的灯光感到不满,刚刚安装了一个新吊灯。

新吊灯由 N 个灯泡组成,这 N 个灯泡围成一圈,编号为 0∼N−1

奶牛对这个新吊灯非常着迷,并且喜欢玩以下游戏:

对于第 i 个灯泡,如果在 T−1 时刻,它左侧的灯泡(当 i>0 时,为第 i−1 个灯泡;当 i=0 时,为第 N−1 个灯泡)是开着,那么在 T 时刻,就切换这个灯泡的状态。

这个游戏将持续 B 单位时间。

给定灯泡的初始状态,请确定在 B 单位时间后,它们的最终状态。

代码

import java.util.*;


public class Main {
    static int n;
    static long k;
    static int[] a = new int[1000100];
    public static int update(int t)
    {
        int sum = 0;
        for(int i = 0; i < n; i ++)
        {
            int j = (i - 1 + n) % n;
            int x = t >> i & 1;
            int y = t >> j & 1;
            sum |= (x ^ y) << i;
        }
        return sum;
    }
    public static void print(int t)
    {
        for(int i = 0; i < n; i ++)
            System.out.println(t >> i & 1);

        return;
    }
    public static void main(String[] args) {
        Scanner inScanner = new Scanner(System.in);
        n = inScanner.nextInt();
        k = inScanner.nextLong();
        int sum = 0;
        for(int i = 0; i < n; i ++)
        {
            int t = inScanner.nextInt();
            sum = sum | t << i;
        }
        inScanner.close();
        Arrays.fill(a, 0);
        for(int i = 1; ; i ++)
        {
            sum = update(sum);
            if(i == k)
            {
                print(sum);
                break;
            }
            else if(a[sum] == 0)
            {
                a[sum] = i;
            }
            else 
            {
                int l = i - a[sum];
                int r = (int) ((k - i) % l);
                while(r-- > 0)
                    sum = update(sum);
                print(sum);
                break;
            }
        }
    }
}
/*
5 6
1
0
0
0
0
*/

文章作者: 姜小白
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜小白 !
评论
  目录