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 ...
随机推荐
- POJ 3267-The Cow Lexicon(DP)
The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8252 Accepted: 3888 D ...
- Linux从用户层到内核层系列 - GNU系列之glibc介绍
题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswa ...
- JavaScript 中创建对象的方法(读书笔记思维导图)
面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.而 ECMAScript 中没有类的概念,所以我们可以使用 ...
- FZU2181+poj2942(点双连通+判奇圈)
分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=3且为奇数)看做一个点双联通分量,那么每个点都至少有两个点与他相邻.即需要保证双联通分量中存在奇圈.至于 ...
- hdu2125(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2125 题意:N×M的网格其中有一条边坏掉了,问从起点到终点的放法数. 分析:数学公式 如果没有坏边的话 ...
- ubuntu linux 13.04更新
首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 而后用gedit或其他编辑器打开: gksu gedit /et ...
- 一 手游开发工具cocos2d-x editor初识
可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...
- 【Oracle】-【sqlplus / as sysdba登录报错问题】-新用户使用sqlplus / as sysdba登录报错
刚才打开一个别人的测试库,用root登陆了的,sqlplus / as sysdba竟然报错,奇怪,于是在自己的VM中模拟该过程. 新建了一个test用户: [test@liu bin]# ./sql ...
- wamp mysql 创建主从数据库
这跟你是不是wmap没有关系的, wamp是一个集成环境,只是一次性帮你创建一个web服务器而已 下面给你些配置 一.登录Master服务器,修改my.ini ,添加如下内容: [wampmysqld ...
- android 图片浏览器 demo
先上效果图,本demo 会逐步完好 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTczMDE2NjEz/font/5a6L5L2T/fontsi ...