HDU1575Tr A(矩阵相乘与快速幂)

Tr A  hdu1575

 

就是一个快速幂的应用:

只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!)

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 using namespace std;
 6 __int64 a[15][15],b[15][15],c[15][15];
 7 int n;
 8 int main()
 9 {
10     int t,i,j,m,k,d;
11     __int64 sum;
12     scanf("%d",&t);
13     while(t--)
14     {
15         scanf("%d%d",&n,&m);
16         for(i=0;i<n;i++)
17             for(j=0;j<n;j++)
18             {scanf("%I64d",&a[i][j]);b[i][j]=a[i][j];}
19         d=0;
20         while(m)
21         {
22             if(m%2&&d==0)//因为快速幂规定起始为1,则第一次就来要分开考虑!!
23             {
24                 for(i=0;i<n;i++)
25                     for(j=0;j<n;j++)
26                         a[i][j]=b[i][j];
27                 d=1;
28             }
29             else if(m%2)
30             {
31                 memset(c,0,sizeof(c));
32                 for(i=0;i<n;i++)
33                     for(j=0;j<n;j++)
34                     for(k=0;k<n;k++)
35                         c[i][j]+=a[i][k]*b[k][j]%9973;
36                 for(i=0;i<n;i++)
37                     for(j=0;j<n;j++)
38                         a[i][j]=c[i][j];
39             }
40             m=m/2;
41             memset(c,0,sizeof(c));
42     for(i=0;i<n;i++)
43         for(j=0;j<n;j++)
44         for(k=0;k<n;k++)
45             c[i][j]+=b[i][k]*b[k][j]%9973;
46     for(i=0;i<n;i++)
47         for(j=0;j<n;j++)
48             b[i][j]=c[i][j];
49         }
50         sum=0;
51         for(i=0;i<n;i++)
52             sum+=a[i][i];
53         printf("%I64d\n",sum%9973);
54     }
55     return 0;
56 }

 

附上快速幂的模板:

 1 __int64 power(__int64 p,__int64 n)  //反复平方法求(p^n)%mod
 2 {
 3     __int64 sq=1;
 4     while(n>0)
 5     {
 6         if(n%2)
 7             sq=(sq*p)%mod;
 8         n/=2;
 9         p=p*p%mod;
10     }
11     return sq;
12 }

 

posted on 2013-09-16 22:17  ~~碾压机  阅读(236)  评论(0编辑  收藏  举报