题目描述:
农夫约翰对牛棚里昏暗的灯光感到不满,刚刚安装了一个新吊灯。
新吊灯由 N 个灯泡组成,这 N 个灯泡围成一圈,编号为 0∼N−1。
奶牛对这个新吊灯非常着迷,并且喜欢玩以下游戏:
对于第 i 个灯泡,如果在 T−1 时刻,它左侧的灯泡(当 i>0时,为第 i−1 个灯泡;当 i=0时,为第 N−1 个灯泡-)是开着,那么在 T时刻,就切换这个灯泡的状态。
这个游戏将持续 B 单位时间。
给定灯泡的初始状态,请确定在 B单位时间后,它们的最终状态。

输入格式:
第一行包含两个整数 N和 B。
接下来 N 行,按顺序描述每个灯泡的初始状态,每行包含一个整数 1(表示开)或 0(表示关)。

输出格式:
共 N行,按顺序每行输出一个灯泡的最终状态。

数据范围:
3≤N≤16,
1≤B≤1015

输入样例:

5 6
1
0
0
0
0

输出样例:

1
1
1
0
1

样例解释:
灯泡状态如下:
时刻 T=0: 1 0 0 0 0
时刻 T=1: 1 1 0 0 0
时刻 T=2: 1 0 1 0 0
时刻 T=3: 1 1 1 1 0
时刻 T=4: 1 0 0 0 1
时刻 T=5: 0 1 0 0 1
时刻 T=6: 1 1 1 0 1

#include<stdio.h>
#include<string.h>int N = 1 << 16; //最多有(1*2的16次方)种不同的状态
int  n;
long long m;int upstate(int state)
{int res = 0;  //state表示当前状态,res表示下一个状态for(int i = 0; i < n; i ++ )  //枚举每一位 {int j = (i - 1 + n) % n; //i-1表示前一位,+1是因为可能存在负数 int x = state >> i & 1;      //state的第i位 int y = state >> j & 1;      //state的第j位 res |= (x ^ y) << i;} return res;
}void print(int state)  //将十进制数转化成二进制数,输出每一位
{for(int i = 0; i < n; i ++ ){printf("%d\n",state >> i & 1);}
}int main()
{int state = 0;int p[N];   //每个状态是第几步走到的 scanf("%d %lld", &n, &m);for(int i = 0; i < n; i ++ ){int x;scanf("%d",&x);state |= x << i;  //第i位是x,把x加到state的第i位上 }memset(p, -1, sizeof(p));p[state] = 0;for(int i = 1; ; i ++) //枚举步数 {state = upstate(state);if (i == m)       //在形成环之前已经走完m步了 {print(state);break;}else if (p[state] == -1) p[state] = i;      //当前状态未被初始化 else    //这个状态走过了,即发现一个环 {int len = i - p[state];      //环的长度 int r = (m - i) % len;      //还需要走r步 while(r -- ) state = upstate(state);print(state);break;}}return 0;}

01串状态压缩:对于只由0和1组成的数字序列(01串),除了用字符串存储,还可以把01串看成一个二进制数,转化成十进制存到一个int里,用int来表示一个状态。

因为灯泡只有开(1)和关(0)两种状态,且3 <= N <=16,所以最多有216种不同的状态,第216+1种状态一定会与前面某个状态相同,当时间足够长时,灯泡的状态变化会形成一个环。

位运算:

  • 按位与 &
    如果 x == 1 且 y == 1,则(x & y) = 1,否则(x & y) = 0
    应用:让某一位或某几位为0;取一个数中的一段。

  • 按位或 |
    如果 x == 1 或 y == 1,则(x | y) = 1,否则(x | y) = 0
    应用:让某一位或某几位为1;把两个数拼起来 。

  • 按位取反 ~
    ~x = 1 -x ,把1位变0,0位变1。

  • 按位异或 ^
    如果 x == y ,则(x ^ y)= 0,否则(x ^ y)= 1;
    x ^ y ^ y —> x。

  • 左移 <<
    i << j : i 中所有的位向左移动 j 个位置,而右边填入0;
    x << = 1 等价于 x *= 2; x << = n 等价于 x *=2n

  • 右移 >>
    i >> j : i 中所有的位向右移动 j 个位置;
    对于unsigned的类型,左边填入0;对于signed的类型,左边填入原来的最高位(保持符号不变);
    x >>= 1 等价于 x /= 2; x >> = n 等价于 x /=2n

输出一个二进制数:

#include<stdio.h>
int main()
{int number;scanf("%d",&number);unsigned mask = 1u << 31;  //共32个比特位,最高位为1 for( ; mask; mask >>= 1){printf("%d",number & mask ? 1 : 0);    //如果取&的结果不等于0,则输出1,否则输出0 } return 0;
}

01串状态压缩(位运算)相关推荐

  1. POJ - 3279 Fliptile(状态压缩+位运算+暴力)

    题目链接:点击查看 题目大意:给出一个n*m的01矩阵,为了好描述,我们设0和1是两个相反的状态,我们的目标是要将整个矩阵全部变成1,现在我们可以将某一个点(x,y)更改为相反的状态,不过相应的该点周 ...

  2. hdu3006 状态压缩+位运算+hash(小想法题)

    题意:        给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路:       是个小想法题目,要用到二进制压缩,位运算, ...

  3. 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)

    八皇后问题的介绍在此不再赘述,只贴一下经典八皇后问题的实现代码(参考刘汝佳 <算法竞赛入门经典>) void search(int i) {if(i>n){ans++;return; ...

  4. POJ-2414 Phylogenetic Trees Inherited 状态压缩,位运算处理集合操作

    该题解题过程非常优美,通过位操作来维护一个可选字符集合.并且完成求并集和交集. 详见代码: #include <cstring> #include <cstdio> #incl ...

  5. LeetCode 2157. 字符串分组(状态压缩+位运算+图的遍历)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的字符串数组 words . 每个字符串都只包含 小写英文字母 .words 中任意一个子串中,每个字母都至多只出现一次. 如果通 ...

  6. java 位运算 多个状态_位运算表示对象所处状态

    通过一个integer类型属性来表示对象所处的状态: CASE: Invitor:邀请者对象模型 Integer Invitor.joinstatus:邀请者所处参加状态 当前存在状态声明:是否被邀请 ...

  7. 程序员面试金典 - 面试题 16.01. 交换数字(位运算swap)

    1. 题目 编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值. 示例: 输入: numbers = [1,2] 输出: [2,1]提示: numbers.length ...

  8. c语言位运算符的应用,c语言位运算(c语言位运算符的用法)

    a=1^8 b=32^32 c=7^3 d=4&3 e=4|3 f=1&-1 求值 求详解 求值 为什么等于这么. 一.位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ...

  9. 位运算 位运算应用

    本页目录 位运算分为2个大类 位于 &(一0则0) 位或| (双0则0) 异或 ^(互异则1) 利用异或可实现一个小面试题,如何不添加变量,实现数据的替换 按位取反 ~ 左移 << ...

最新文章

  1. iPhone 隐私新规下的“大地震”:四大平台损失近百亿美元,“连用户是男是女都分不清……”
  2. STM32开发 -- 自动连接一个未保存过的WIFI
  3. 国内SAP UI5使用者关于性能优化和UI5 Web Component的讨论
  4. 标识为普通SQL语法
  5. ftp的本地用户搭建
  6. 中国智慧VS西方智慧-看中国IT风云与IT产业怪状
  7. linux开源游戏_2014年杰出的开源和Linux游戏
  8. GAE 博客——B3log Solo 0.3.0 正式版发布了!
  9. Java基础回顾Application(二)
  10. VisualTreeHelper
  11. 美国网络安全体系架构揭秘
  12. html src data:image,Browser/HTML Force download of image from src=“data:image/jpeg;base64…”
  13. Tableau 发布到tableau online错误
  14. t-SNE 高维数据可视化
  15. mysql order by注入_sql注入之order by注入
  16. ioi 赛制_如何评价 IOI 2017(国际信息学奥林匹克竞赛)?
  17. rom是计算机硬件吗,rom,教你手机中ram和rom的区别
  18. bootstrap 黑边框表格样式_bootstrap4 使用及常用样式详细整理
  19. 【原】通俗说法所谓数码相机的“动态像素”和“静态像素”背后的故事
  20. 【Windows】如何修改远程桌面端口3389

热门文章

  1. swi 指令能用在C语言吗,arm处理器异常处理-swi - zgolee的专栏 - CSDN博客
  2. 互联网小现象:BAT疯狂投资,网易为何单打独斗?
  3. randperm算子不支持导出onnx
  4. Eureka的UNKNOWN
  5. 魔兽美服服务器维护,心得:美服12小时纯任务练级获服务器第一90级
  6. 【华为OD机试真题 python】完美走位【2022 Q4 | 100分】
  7. QS发布2021年世界大学排名!你报考的大学排第几?
  8. 地图可视化不只是pyecharts.map
  9. 3.3差错控制(检错编码、纠错编码)
  10. Java Bean Validation 详解