• 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
    ",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 }
  • 相关阅读:
    OpenSSL证书生成
    支付宝支付流程
    前端获取用户位置信息
    微信公众号开发(三)
    微信公众号开发(二)
    微信公众号开发(一)
    前端优化
    页面自适应
    CSS样式(二)
    CSS样式(一)
  • 原文地址:https://www.cnblogs.com/tt123/p/3325337.html
Copyright © 2020-2023  润新知