您的位置:首页 > 其它

hdu 2276 点灯(矩阵应用)

2013-03-03 11:10 183 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2276

题意:有n盏灯,0表示不亮,1表示亮,如果 i-th的灯的左边灯是亮的,那么下一秒钟,i-th灯的状态要改变,0变成1,1变成0。问你在第t秒时,灯的状态时什么样的,输出来。

于是有:

a1 = (a1+an)%2,a2 = (a1+a2)%2,a3 = (a2+a3)%2,……an = (an+an-1)%2

构造矩阵:

|1 0 0 0··· 0 0 1| a1 |a1+an|

|1 1 0 0··· 0 0 0| a2 |a1+a2|

|0 1 1 0 ···0 0 0| a3 |a2+a3|

|0 0 1 1 ···0 0 0| a4 |a3+a4|

| ··· | ai |……... |

|A|^M|B|=|E|;B为输入矩阵,即为| a1 a2 a3 a4 ... ai |

从而矩阵求幂即可;

但一开始我用递归求幂,发现栈溢出。。。。

然后把求幂函数改了就过了。。。。

View Code

#include<iostream>
#include<string>
const int N=101;
using namespace std;
string str;
int len,n;

struct Matrix{
int map

;
};

Matrix mata,matb,Unit;

void Initiate(){
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(i==0&&(j==0||j==len-1)){
if(i==j)Unit.map[i][j]=1;
else Unit.map[i][j]=0;
mata.map[i][j]=1;
}else{
if(i==j)Unit.map[i][j]=1;
else Unit.map[i][j]=0;
mata.map[i][j]=0;
}
}
}
for(int i=1;i<len;i++){
mata.map[i][i]=mata.map[i][i-1]=1;
}
for(int i=0;i<len;i++){
matb.map[i][0]=str[i]-'0';
}
}

Matrix Mul(Matrix &a,Matrix &b){
Matrix c;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
c.map[i][j]=0;
for(int k=0;k<len;k++){
c.map[i][j]^=a.map[i][k]&b.map[k][j];
}
}
}
return c;
}
/*
Matrix Pow(int n){
if(n==1)return mata;
else if(n&1){
return Mul(mata,Pow(n-1));
}else {
Matrix temp=Pow(n>>1);
return Mul(temp,temp);
}
}
*/

Matrix Pow(int n){
Matrix p=Unit,q=mata;
while(n){
if(n&1){
p=Mul(p,q);
}
n>>=1;
q=Mul(q,q);
}
p=Mul(p,matb);
return p;
}

int main(){
while(scanf("%d",&n)!=EOF){
cin>>str;
len=str.size();
Initiate();
mata=Pow(n);
for(int i=0;i<len;i++){
printf("%d",mata.map[i][0]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: