hdu 1575   Tr A

  http://acm.hdu.edu.cn/showproblem.php?pid=1575

矩阵快速幂!

第一次写矩阵快幂,因为以前写过数的快速幂所以矩阵写起来就很顺手了。

View Code
 1 # include<stdio.h>
2 # include<string.h>
3 # define N 15
4 # define Mod 9973
5 int a[N][N],b[N][N],mm[N][N];
6 int main()
7 {
8 int i,j,n,ncase,m,sum,h;
9 scanf("%d",&ncase);
10 while(ncase--)
11 {
12 scanf("%d%d",&n,&m);
13 for(i=1;i<=n;i++)
14 for(j=1;j<=n;j++)
15 {
16 scanf("%d",&a[i][j]);
17 a[i][j]%=Mod;
18 }
19 memset(mm,0,sizeof(mm));
20 for(i=1;i<=n;i++)
21 mm[i][i]=1;
22 while(m>=1)
23 {
24 if(m%2!=0)
25 {
26 memset(b,0,sizeof(b));
27 for(i=1;i<=n;i++)
28 {
29 for(j=1;j<=n;j++)
30 {
31 for(h=1;h<=n;h++)
32 {
33 b[i][j]+=mm[i][h]*a[h][j];
34 b[i][j]%=Mod;
35 }
36 }
37 }
38 for(i=1;i<=n;i++)
39 for(j=1;j<=n;j++)
40 {
41 mm[i][j]=b[i][j];
42 mm[i][j]%=Mod;
43 }
44 }
45 memset(b,0,sizeof(b));
46 for(i=1;i<=n;i++)
47 {
48 for(j=1;j<=n;j++)
49 for(h=1;h<=n;h++)
50 b[i][j]+=a[i][h]*a[h][j];
51 }
52 for(i=1;i<=n;i++)
53 for(j=1;j<=n;j++)
54 {
55 a[i][j]=b[i][j];
56 a[i][j]%=Mod;
57 }
58 m/=2;
59 }
60 sum=0;
61 for(i=1;i<=n;i++)
62 sum+=mm[i][i];
63 sum%=Mod;
64 printf("%d\n",sum);
65 }
66 return 0;
67 }

 

 

pku 3233  Matrix Power Series

http://poj.org/problem?id=3233

A+A^2+A^3+...+A^k =  ( 1 + A^(k/2) )*(A+A^2+...+ A^(k/2) ) +  {A^k};

如果k是偶数的话就不加大括号中的数。

然后一直二分,递归二分。

我写了个代码比较龊。。跑了1900ms+

View Code
  1 # include<stdio.h>
2 # include<string.h>
3 # define N 35
4 int a[N][N],n,p;
5 struct node1{
6 int s1[N][N];
7 };
8 struct node2{
9 int s2[N][N];
10 };
11 node1 mod(int k)
12 {
13 int b[N][N],c[N][N],i,j,h,goal[N][N];
14 node1 cur;
15 for(i=1;i<=n;i++)
16 for(j=1;j<=n;j++)
17 b[i][j]=a[i][j];
18 memset(goal,0,sizeof(goal));
19 for(i=1;i<=n;i++)
20 goal[i][i]=1;
21 while(k!=0)
22 {
23 if(k%2)
24 {
25 memset(c,0,sizeof(c));
26 for(i=1;i<=n;i++)
27 {
28 for(j=1;j<=n;j++)
29 {
30 for(h=1;h<=n;h++)
31 {
32 c[i][j]+=((goal[i][h]*b[h][j])%p);
33 c[i][j]%=p;
34 }
35 }
36 }
37 for(i=1;i<=n;i++)
38 for(j=1;j<=n;j++)
39 {
40 goal[i][j]=c[i][j];
41 goal[i][j]%=p;
42 }
43 }
44 memset(c,0,sizeof(c));
45 for(i=1;i<=n;i++)
46 for(j=1;j<=n;j++)
47 for(h=1;h<=n;h++)
48 {
49 c[i][j]+=b[i][h]*b[h][j];
50 c[i][j]%=p;
51 }
52 for(i=1;i<=n;i++)
53 for(j=1;j<=n;j++)
54 b[i][j]=c[i][j];
55 k/=2;
56 }
57 for(i=1;i<=n;i++)
58 for(j=1;j<=n;j++)
59 cur.s1[i][j]=goal[i][j];
60 return cur;
61 }
62 node2 dfs(int k)
63 {
64 int ans[N][N],c[N][N],i,j,h;
65 node2 cur;
66 node1 cur1;
67 if(k==1)
68 {
69 for(i=1;i<=n;i++)
70 for(j=1;j<=n;j++)
71 cur.s2[i][j]=a[i][j];
72 return cur;
73 }
74 memset(ans,0,sizeof(ans));
75 if(k%2)
76 {
77 cur1=mod(k);
78 for(i=1;i<=n;i++)
79 for(j=1;j<=n;j++)
80 ans[i][j]=cur1.s1[i][j];
81 }
82 cur1=mod(k/2);
83 cur=dfs(k/2);
84 for(i=1;i<=n;i++)
85 {
86 cur1.s1[i][i]+=1;
87 cur1.s1[i][i]%=p;
88 }
89 memset(c,0,sizeof(c));
90 for(i=1;i<=n;i++)
91 for(j=1;j<=n;j++)
92 {
93 for(h=1;h<=n;h++)
94 {
95 c[i][j]+=cur1.s1[i][h]*cur.s2[h][j];
96 c[i][j]%=p;
97 }
98 }
99 for(i=1;i<=n;i++)
100 for(j=1;j<=n;j++)
101 {
102 cur.s2[i][j]=c[i][j]+ans[i][j];
103 cur.s2[i][j]%=p;
104 }
105 return cur;
106 }
107 int main()
108 {
109 int i,j,k;
110 node2 cur;
111 while(scanf("%d%d%d",&n,&k,&p)!=EOF)
112 {
113 for(i=1;i<=n;i++)
114 for(j=1;j<=n;j++)
115 {
116 scanf("%d",&a[i][j]);
117 a[i][j]%=p;
118 }
119 cur=dfs(k);
120 for(i=1;i<=n;i++)
121 {
122 for(j=1;j<=n;j++)
123 {
124 if(j==1) printf("%d",cur.s2[i][j]);
125 else printf(" %d",cur.s2[i][j]);
126 }
127 printf("\n");
128 }
129 }
130 return 0;
131 }

 

 

 

 

posted on 2011-10-31 17:46  奋斗青春  阅读(204)  评论(0编辑  收藏  举报