题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2276

题目意思:给予一个01字符串,表示一串灯的明亮状态,现在每过一秒,如何这个灯的左边的灯是亮的,我们就改变他的明亮状态。(从左往右依次更新)注:第一个的左边是最后一个(即0的左边是n-1),问n秒后所有灯的明亮状态。

思路:采用矩阵快速幂啊!这个题十分有意思,采用了位运算,是真的没有想到。


以上是以样例一(0101111)为例的系数矩阵,我们发现对于相邻的两位只存在四种情况00,01,10,11,其中00,01保持原样不变,10和11分别变成11和10,我们惊奇的发现(1&1)^(1&1)=0,(1&1)^(1&0)=1,是不是满足这个变换?而(0&1)^(0&1)=0,(0&1)^(1&1)=1保持不变。这个就是这道题的难点,希望可以记住这个类型的变换。这样我们就可以通过上面的系数矩阵通过矩阵快速幂快速得到n秒后的状态了!!!

代码:

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define maxn 101
using namespace std;
typedef long long ll;
int n;
struct Matrix{
ll mat[maxn][maxn];
Matrix operator * (const Matrix & m) const{
Matrix tmp;
for(int i=;i<n;i++)
for(int j=;j<n;j++){
tmp.mat[i][j]=;
for(int k=;k<n;k++){
tmp.mat[i][j]^=mat[i][k]&m.mat[k][j];
}
}
return tmp;
}
};
Matrix POW(Matrix &m,ll k){
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for(int i=;i<n;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
ll num;
while(cin>>num){
string q;
cin>>q;
n=q.size();
Matrix m,f;
memset(m.mat,,sizeof(m.mat));
memset(f.mat,,sizeof(f.mat));
for(int i=;i<n;i++) f.mat[i][]=q[i]-'';
m.mat[][]=m.mat[][n-]=;
for(int i=;i<n;i++) m.mat[i][i-]=m.mat[i][i]=;
Matrix x=POW(m,num);
Matrix ans=x*f;
for(int i=;i<n;i++) cout<<ans.mat[i][];
cout<<endl;
}
return ;
}

最新文章

  1. [ACM_贪心] Radar Installation
  2. Ubuntu+Nginx+PHP的最简搭建方法
  3. 借助LVS+Keepalived实现负载均衡(转)
  4. MHA手动在线切换主 原创3(主不参与复制)
  5. 将OutLook.exe注册为服务,让其一直保持开启状态
  6. c# 网页打印全流程
  7. 【bzoj2151】种树
  8. 新概念英语(1-29)Come in, Amy.
  9. Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!
  10. maven 禁止连接外网仓库
  11. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
  12. python3+cv2+andiord安卓摄像头
  13. 9. Bookshops in London 伦敦书店
  14. 经典的js返回(退个页面)
  15. 使用include重用布局
  16. spring boot mybatis sql打印到控制台
  17. 多态、抽象类、接口_DAY09
  18. ipcs命令以及oracle内存段
  19. WEBSERVICE-AXIS2服务端代码
  20. vim相关命令单独记载

热门文章

  1. shell获取用户输入
  2. iOS应用安全防护框架概述
  3. eclipse 安装maven
  4. 内存对齐与ANSI C中struct型数据的内存布局
  5. mysql学习笔记1---mysql ERROR 1045 (28000): 错误解决办法
  6. c#用picturebox显示多页TIF
  7. PHP——0128练习相关2——js点击button按钮跳转到另一个新页面
  8. Thinkphp3.2 PHPMailer 发送 QQ邮箱 163邮箱
  9. EMPTY表示元素不能包含文本,也不能包含子元素
  10. 程序员自己编写的类和JDK类是一种合作关系