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 }

 

你可能感兴趣的:(HDU)