NYOJ 300 && hdu 2276 Kiki & Little Kiki 2 (矩阵高速功率)
- 描写叙述
- There are n lights in a circle numbered from 1 to n. The left of light 1 is light n, and the left of light
k (1< k<= n) is the light k-1.At time of 0, some of them turn on, and others turn off.
Change the state of light i (if it's on, turn off it; if it is not on, turn on it) at t+1 second (t >= 0), if the left of light i is on !!! Given the initiation state, please find all lights’ state after M second. (2<= n <= 100, 1<= M<= 10^8)- 输入
- The input contains no more than 1000 data sets. The first line of each data set is an integer m indicate the time, the second line will be a string T, only contains '0' and '1' , and its length n will
not exceed 100. It means all lights in the circle from 1 to n.
If the ith character of T is '1', it means the light i is on, otherwise the light is off. - 输出
- For each data set, output all lights' state at m seconds in one line. It only contains character '0' and '1.
- 例子输入
-
1
0101111
10
100000001 - 例子输出
-
1111000
001000010题意:给出一些灯的初始状态(用0、1表示)。对这些灯进行m次变换。若当前灯的前一盏灯的状态为1,则调整当前灯的状态。0变为1,1变为0;否则不变。第1盏灯的前一盏灯是最后一盏灯。
问最后每盏灯的状态。
分析:通过模拟能够发现,如果有n盏灯。第i盏灯的状态为f[i],则f[i] = (f[i] + f[i-1])%2;又由于这些灯形成了环,则f[i] = (f[i] + f[(n+i-2)%n+1])%2. 这样初始状态形成一个1*n的矩阵。然后构造出例如以下n*n的矩阵:
1 1 0…… 0 0
0 1 1…… 0 0
……………………
1 0 0…… 0 1
每次乘以这个矩阵得出的结果就是下一个状态。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
char state[N];
struct Matrix {
Matrix() {}
void Init(int n) {
row = n; col = n;
memset(mat, 0, sizeof(mat));
for(int i = 0; i < n; i++)
mat[i][i] = 1;
}
void Init(int m, int n) {
row = m; col = n;
memset(mat, 0, sizeof(mat));
}
int row, col;
int mat[N][N];
const Matrix &Pow(int n);
}; const Matrix &operator *(const Matrix &A, const Matrix &B) {
Matrix res;
res.Init(A.row, B.col);
for(int i = 0; i < A.row; i++) {
for(int j = 0; j < A.col; j++) {
if(A.mat[i][j]) {
for(int k = 0; k < B.col; k++) {
if(B.mat[j][k])
res.mat[i][k] = res.mat[i][k] ^ (A.mat[i][j] & B.mat[j][k]);
}
} }
}
return res;
} const Matrix &Matrix::Pow(int n) {
Matrix tmp, pre;
tmp = *this;
pre.Init(this->row);
while(n) {
if(n&1) pre = tmp * pre;
tmp = tmp * tmp;
n >>= 1;
}
return pre;
} int main() {
int m;
Matrix A, B, ans;
while(~scanf("%d", &m)) {
scanf("%s",state);
int len = strlen(state);
A.Init(1, len);
for(int i = 0; i < len; i++)
A.mat[0][i] = state[i] - '0';
B.Init(len);
for(int i = 0; i < len; i++) {
B.mat[i][i] = 1;
B.mat[i][(i+1)%len] = 1;
}
ans = A * B.Pow(m);
for(int i = 0; i < len; i++)
printf("%d", ans.mat[0][i]);
printf("\n");
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
NYOJ 300 && hdu 2276 Kiki & Little Kiki 2 (矩阵高速功率)的更多相关文章
- hdu 2243 考研绝望——复杂的文字(AC自己主动机+矩阵高速功率)
pid=2243" target="_blank" style="">题目链接:hdu 2243 考研路茫茫--单词情结 题目大意:略. 解题思 ...
- hdu 5318 The Goddess Of The Moon 矩阵高速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS ( ...
- HDU 2842 Chinese Rings(矩阵高速功率+递归)
职务地址:HDU 2842 这个游戏是一个九连环的游戏. 如果当前要卸下前n个环.由于要满足前n-2个都卸下,所以要先把前n-2个卸下.须要f(n-2)次.然后把第n个卸下须要1次,然后这时候要卸下第 ...
- HDU 1757 A Simple Math Problem(矩阵高速幂)
题目地址:HDU 1757 最终会构造矩阵了.事实上也不难,仅仅怪自己笨..= =! f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 ...
- HDU 4896 Minimal Spanning Tree(矩阵高速功率)
意甲冠军: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一 ...
- hdu 1757 A Simple Math Problem (矩阵高速幂)
和这一题构造的矩阵的方法同样. 须要注意的是.题目中a0~a9 与矩阵相乘的顺序. #include <iostream> #include <cstdio> #include ...
- hdu 3306 Another kind of Fibonacci(矩阵高速幂)
Another kind of Fibonacci Time Limit: 3000/10 ...
- NYOJ 298 相变点(矩阵高速功率)
点的变换 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描写叙述 平面上有不超过10000个点.坐标都是已知的.如今可能对全部的点做下面几种操作: 平移一定距离(M),相对X ...
- HDU - 2294 Pendant (DP滚动数组降维+矩阵高速功率)
Description On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend ...
随机推荐
- .idata数据的解析
每类Section代表不同的数据,不同的数据存储组织方式一定是有非常大区别的.代码段与资源段一定区别巨大,这意味着我需要一个一个的学习每个段的解析. idata段解析 这个段主要存储的是导入符号信息. ...
- 在 Java 项目中解压7Zip特殊压缩算法文件
1 问题描写叙述 Java Web 后端下载了一个经特殊算法压缩的 zip 文件,由于不能採用 java 本身自带的解压方式,必须採用 7Zip 来解压.所以,提到了本文中在 java web 后端调 ...
- Android font-awesome 4.2 icons png(包含holo-light和holo-dark)
项目地址: https://github.com/bitjjj/android-font-awesome-4.2-icon-pngs
- [linux]ubuntu apt-get安装软件失败
1.首先查看 dns 配置 sudo vi /etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8 2.修改 apt-get 源 ...
- ASA failover应用
failover的条件: 1.硬件型号必须相同 2.系统版本必须一致 3.模式必须一致 4.相同的许可和许可的数量 步骤: step 1:配置failover interface,确保状态 up LZ ...
- dell服务器各类raid 和磁盘在阵列卡上的实验
听很多人说,做好阵列的硬盘从阵列上移除后,重新从硬盘导入阵列信息的时候不能打乱位置,昨天用两台Dell R710,四块sas 300G HP硬盘做实验,实验步骤如下: 一.dell R710首先用三块 ...
- poj1935(树形dp)
题目链接:http://poj.org/problem?id=1935 题意:带边权的树,给点一个根,问从根出发遍历某些点,所需的最小花费. 分析:树上任意两点的路径是唯一的,直接dfs一遍,可以得出 ...
- 【Unity3D自学记录】可视化对照十多种排序算法(C#版)
在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...
- 代码重构 & 代码中的坏味道
1.重构 1.1 为什么要重构 1.1.1 改进程序设计 程序员为了快速完成任务,在没有完全理解整体架构之前就开始写代码, 导致程序逐渐失去自己的结构.重构则帮助重新组织代码,重新清晰的体现 程序结构 ...
- EF一次请求公用一个实例
应用场景: 我们在程序开发时,对数据库的操作是必不可少的部分,常规的做法是直接使用Using()语句块,在用完后立即释放连接资源,这种做法在桌面应用程序中毫无问题,但是在Web程序中,尤其是在当今大数 ...