Kiki & Little Kiki 2

转载自:点这里

【题目链接】Kiki & Little Kiki 2

【题目类型】矩阵位运算

&题意:

一排灯,开关状态已知,每过一秒:第i个灯会根据刚才左边的那个灯的开关情况变化,如果左边是开的,它就会变化,如果是关的,就保持原来状态。问m秒后的状态。

第1个的左边是最后一个。

&题解:

题目给定一个01字符串然后进行m次的变换,变换的规则是:如果当前位置i的左边是1(题目说了是个圆,下标为0的左边是n-1),那么i就要改变状态0->1 , 1->0; 比如当前的状态为100101那么一秒过后的状态为010111

假设0/1串的长度为n,保存在a数组,下标从0开始;根据上面的规则我们发现可以得出一秒过后的状态即为a[i] = (a[i]+a[i-1])%2 , 对于a[0] = (a[0]+a[n-1])%2 以上就是递推公式

接着要找矩阵了:



最后还要注意,如果直接取模,会超时,所以改成位运算会很快,(第一次发现位运算比直接算的时间快了这么多)



&代码:

#include <cstdio>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
using ll=long long;
const int maxn= 1e2 +9;
typedef vector<ll> vec;
typedef vector<vec> mat;
int M=2;
mat mul(mat &A,mat &B)
{
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();i++)
for(int k=0;k<B.size();k++)
for(int j=0;j<B[0].size();j++){
//这种情况会T,所以只有0和1两种情况的时候,一定要用位运算
// C[i][j]=(C[i][j]+A[i][k]*B[k][j])%M;
//这种位运算就可以A了
C[i][j]^=(A[i][k]&B[k][j]);
}
return C;
}
mat bin_pow(mat A,ll n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();i++){
B[i][i]=1;
}
while(n>0){
if(n&1)
B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
ll m,n;
string s;
int main()
{
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
freopen("E:1.txt","r",stdin);
while(cin>>m){
cin>>s;
n=s.size();
mat a(n,vec(1));
for(int i=n-1;i>=0;i--)
a[i][0]=s[i]-'0';
mat A(n,vec(n));
A[0][0]=A[0][n-1]=1;
for(int i=1;i<n;i++){
A[i][i]=A[i][i-1]=1;
}
// for(auto i:A){
// for(auto j:i)
// cout<<j<<" ";
// cout<<endl;
// }
// for(auto i:a){
// for(auto j:i)
// cout<<j<<" ";
// cout<<endl;
// }
A=bin_pow(A,m);
A=mul(A,a);
for(int i=0;i<n;i++)
cout<<A[i][0];
cout<<endl;
}
return 0;
}

最新文章

  1. 集合2--毕向东java基础教程视频学习笔记
  2. ESXi查询网卡的驱动和固件版本
  3. php 对象中连贯执行方法
  4. 使用mysqladmin ext了解MySQL运行状态【转】
  5. WCF实例上下文
  6. JDBC链接
  7. python爬虫程序
  8. Which PHP mode? Apache vs CGI vs FastCGI
  9. POJ 2208 已知边四面体六个长度,计算体积
  10. WOJ 124. Football Coach 网络流
  11. 基于Spring注解搭建SpringMVC项目
  12. hibernate中怎样配置两个联合属性为唯一约束(非联合主键)
  13. tab选项卡--jq
  14. STM32的SWD调试进不了main函数
  15. Android中,如何提升Layout的性能?
  16. 解决springboot druid 数据库批量更新错误问题
  17. [六字真言]4.叭.SpringMVC异常痛苦
  18. 【转】每天一个linux命令(50):crontab命令
  19. Android平台上优秀的开源项目
  20. Linux printf 命令

热门文章

  1. angular 使用dialog的经验
  2. 内存不够怎么办? 1.5.1 关于隔离 1.5.2 分段(Segmention) 1.5.3 分页(Paging)
  3. [filesystem][archlinux][disk encryption][btrfs] btrfs
  4. 【PyQt5-Qt Designer】PyQt5+eric6 安装和配置
  5. finecms如何调用多个指定栏目的内容
  6. MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常 解决方法
  7. Tensorflow安装记录
  8. FastReport快速安装教程
  9. 小睿开始呼叫用户,然后FS怎么跟用户交互的整个流程原理
  10. linux find grep tail