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
题意:有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; }
相关文章推荐
- hdu 2276 点灯(矩阵应用)
- hdu 2276 Kiki & Little Kiki 2 矩阵的应用
- Kiki & Little Kiki 2 - HDU 2276 - 矩阵快速幂
- Hdu 2276 && Nyoj 300 Kiki & Little Kiki 2[矩阵快速幂]
- HDU 2276 Kiki & Little Kiki 2(矩阵快速幂)
- NYOJ 300 && hdu 2276 Kiki & Little Kiki 2 (矩阵快速幂)
- hdu 2276矩阵快速幂
- hdu 2276(矩阵快速幂)
- hdu 2157 How many ways??(矩阵乘法经典应用)
- HDU 2276(数论,构造二分矩阵)
- hdu 2276 Kiki & Little Kiki 2(矩阵构造乘法)
- hdu 2276 Kiki & Little Kiki 2(矩阵乘法)
- hdu 4565 矩阵快速幂+共轭的应用
- hdu 2276 Kiki & Little Kiki 2(矩阵快速幂)
- HDU 2254 奥运 矩阵应用
- hdu 2276 Kiki & Little Kiki 2矩阵快速幂
- hdu 2276(矩阵快速幂)
- HDU_Steps8.3 矩阵应用 HDU1575 HDU1757 HDU2294 HDU2254 HDU2276 HDU2855 HDU3519 HDU3509
- hdu 2276 Kiki & Little Kiki 2 矩阵快速幂
- HDU - 2276 Kiki & Little Kiki 2 矩阵快速幂