poj3233Matrix Power Series

链接

也是矩阵经典题目  二分递归求解

a+a^2+a^3+..+a^(k/2)+a^(k/2+1)+...+a^k = a+a^2+..+a^k/2+a^k/2(a^1+a^2+..+a^k/2)(偶数)

a+a^2+a^3+..+a^(k/2)+a^(k/2+1)+...+a^k = a+a^2+..+a^k/2+a^k/2(a^1+a^2+..+a^k/2)+a^k。 奇数

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 #include<vector>

 7 #include<cmath>

 8 #include<queue>

 9 #include<set>

10 using namespace std;

11 #define N 1e9

12 #define LL long long

13 #define INF 0xfffffff

14 const double eps = 1e-8;

15 const double pi = acos(-1.0);

16 const double inf = ~0u>>2;

17 struct Mat

18 {

19     int mat[31][31];

20 };

21 int n,mod;

22 Mat operator + (Mat a,Mat b)

23 {

24     Mat c;

25     int i,j;

26     for(i = 0 ; i < n ;i++)

27         for(j = 0 ;j < n ;j++)

28         {

29             if(a.mat[i][j]+b.mat[i][j]>mod)

30             c.mat[i][j] = (a.mat[i][j]+b.mat[i][j])%mod;

31             else

32             c.mat[i][j] = a.mat[i][j]+b.mat[i][j];

33         }

34     return c;

35 }

36 Mat operator * (Mat a,Mat b)

37 {

38     Mat c;

39     memset(c.mat,0,sizeof(c.mat));

40     int i,j,k;

41     for(k =0 ; k < n ; k++)

42     {

43         for(i = 0 ; i < n ;i++)

44         {

45             if(a.mat[i][k]==0) continue;

46             for(j = 0 ;j < n ;j++)

47             {

48                 if(b.mat[k][j]==0) continue;

49                 c.mat[i][j] = (c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod;

50             }

51         }

52     }

53     return c;

54 }

55 Mat operator ^(Mat a,int k)

56 {

57     Mat c;

58     int i,j;

59     for(i =0 ; i < n ;i++)

60         for(j = 0; j < n ;j++)

61         c.mat[i][j] = (i==j);

62     for(; k ;k >>= 1)

63     {

64         if(k&1) c = c*a;

65         a = a*a;

66     }

67     return c;

68 }

69 Mat solve(Mat x,int k)

70 {

71     if(k==1) return x;

72     Mat c ;

73     c = x^k;

74     Mat a = solve(x,k/2);

75     Mat b = x^(k/2);

76     if(k&1) c = a+b*a+c;

77     else c = a+b*a;

78     return c;

79 }

80 int main()

81 {

82     int t;

83     int i,j;

84     while(scanf("%d%d%d",&n,&t,&mod)!=EOF)

85     {

86         Mat x;

87         for(i = 0 ; i < n ;i++)

88             for(j = 0; j < n ;j++)

89             scanf("%d",&x.mat[i][j]);

90         x = solve(x,t);

91         for(i =0 ; i < n ;i++)

92         {

93             for(j =0 ; j < n-1; j++)

94             printf("%d ",x.mat[i][j]%mod);

95             printf("%d\n",x.mat[i][n-1]%mod);

96         }

97     }

98     return 0;

99 }
View Code

 

你可能感兴趣的:(Matrix)