• hdu 2276 点灯(矩阵应用)


    题目链接: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
     1 #include<iostream>
     2 #include<string>
     3 const int N=101;
     4 using namespace std;
     5 string str;
     6 int len,n;
     7 
     8 struct Matrix{
     9     int map[N][N];
    10 };
    11 
    12 Matrix mata,matb,Unit;
    13 
    14 void Initiate(){
    15     for(int i=0;i<len;i++){
    16         for(int j=0;j<len;j++){
    17             if(i==0&&(j==0||j==len-1)){
    18                 if(i==j)Unit.map[i][j]=1;
    19                 else Unit.map[i][j]=0;
    20                 mata.map[i][j]=1;
    21             }else{ 
    22                 if(i==j)Unit.map[i][j]=1;
    23                 else Unit.map[i][j]=0;
    24                 mata.map[i][j]=0;
    25             }
    26         }
    27     }
    28     for(int i=1;i<len;i++){
    29         mata.map[i][i]=mata.map[i][i-1]=1;
    30     }
    31     for(int i=0;i<len;i++){
    32         matb.map[i][0]=str[i]-'0';
    33     }
    34 }
    35 
    36 Matrix Mul(Matrix &a,Matrix &b){
    37     Matrix c;
    38     for(int i=0;i<len;i++){
    39         for(int j=0;j<len;j++){
    40             c.map[i][j]=0;
    41             for(int k=0;k<len;k++){
    42                 c.map[i][j]^=a.map[i][k]&b.map[k][j];
    43             }
    44         }
    45     }
    46     return c;
    47 }
    48 /*
    49 Matrix Pow(int n){
    50     if(n==1)return mata;
    51     else if(n&1){
    52         return Mul(mata,Pow(n-1));
    53     }else {
    54         Matrix temp=Pow(n>>1);
    55         return Mul(temp,temp);
    56     }
    57 }
    58 */
    59 
    60 Matrix Pow(int n){
    61     Matrix p=Unit,q=mata;
    62     while(n){
    63         if(n&1){
    64             p=Mul(p,q);
    65         }
    66         n>>=1;
    67         q=Mul(q,q);
    68     }
    69     p=Mul(p,matb);
    70     return p;
    71 }
    72 
    73 int main(){
    74     while(scanf("%d",&n)!=EOF){
    75         cin>>str;
    76         len=str.size();
    77         Initiate();
    78         mata=Pow(n);
    79         for(int i=0;i<len;i++){
    80             printf("%d",mata.map[i][0]);
    81         }
    82         printf("\n");
    83     }
    84     return 0;
    85 }
  • 相关阅读:
    位或( | )
    学习进度笔记7
    学习进度笔记6
    学习进度笔记5
    学习进度笔记4
    学习进度笔记3
    学习进度笔记2
    学习进度笔记1
    周总结13
    《黑客与画家》阅读笔记6
  • 原文地址:https://www.cnblogs.com/wally/p/2941308.html
Copyright © 2020-2023  润新知