zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    g4e基础篇#1 为什么要使用版本控制系统
    软件开发的自然属性
    定时器实现延时处理
    二分查找法
    php实现循环链表
    redis实现分布式锁
    RabbitMq初探——用队列实现RPC
    RabbitMq初探——发布与订阅
    RabbitMq初探——消息均发
    RabbitMq初探——消息持久化
  • 原文地址:https://www.cnblogs.com/tt123/p/3325337.html
Copyright © 2011-2022 走看看