• hdoj 1757 A Simple Math Problem


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757

    解题思路:矩阵快速幂

      1 ///////////////////////////////////////////////////////////////////////////
      2 //problem_id: hdoj 1757
      3 //user_id: SCNU20102200088
      4 ///////////////////////////////////////////////////////////////////////////
      5 
      6 #include <algorithm>
      7 #include <iostream>
      8 #include <iterator>
      9 #include <iomanip>
     10 #include <cstring>
     11 #include <cstdlib>
     12 #include <string>
     13 #include <vector>
     14 #include <cstdio>
     15 #include <cctype>
     16 #include <cmath>
     17 #include <queue>
     18 #include <stack>
     19 #include <list>
     20 #include <set>
     21 #include <map>
     22 using namespace std;
     23 
     24 ///////////////////////////////////////////////////////////////////////////
     25 #pragma comment(linker,"/STACK:1024000000,1024000000")
     26 
     27 #define lson l,m,rt<<1
     28 #define rson m+1,r,rt<<1|1
     29 ///////////////////////////////////////////////////////////////////////////
     30 
     31 ///////////////////////////////////////////////////////////////////////////
     32 const double EPS=1e-8;
     33 const double PI=acos(-1.0);
     34 
     35 const int x4[]={-1,0,1,0};
     36 const int y4[]={0,1,0,-1};
     37 const int x8[]={-1,-1,0,1,1,1,0,-1};
     38 const int y8[]={0,1,1,1,0,-1,-1,-1};
     39 ///////////////////////////////////////////////////////////////////////////
     40 
     41 ///////////////////////////////////////////////////////////////////////////
     42 typedef long long LL;
     43 
     44 typedef int T;
     45 T max(T a,T b){ return a>b? a:b; }
     46 T min(T a,T b){ return a<b? a:b; }
     47 T gcd(T a,T b){ return b==0? a:gcd(b,a%b); }
     48 T lcm(T a,T b){ return a/gcd(a,b)*b; }
     49 ///////////////////////////////////////////////////////////////////////////
     50 
     51 ///////////////////////////////////////////////////////////////////////////
     52 //Add Code:
     53 LL m;
     54 
     55 struct Matrix{
     56     LL a[10][10];
     57 }origin,res;
     58 
     59 Matrix multiply(Matrix x,Matrix y){
     60     Matrix ret;
     61     for(int i=0;i<=9;i++){
     62         for(int j=0;j<=9;j++){
     63             ret.a[i][j]=0;
     64             for(int k=0;k<=9;k++) ret.a[i][j]+=x.a[i][k]*y.a[k][j];
     65             ret.a[i][j]%=m;
     66         }
     67     }
     68     return ret;
     69 }
     70 
     71 void cal(int n){
     72     while(n){
     73         if(n&1) res=multiply(res,origin);
     74         origin=multiply(origin,origin);
     75         n>>=1;
     76     }
     77 }
     78 ///////////////////////////////////////////////////////////////////////////
     79 
     80 int main(){
     81     ///////////////////////////////////////////////////////////////////////
     82     //Add Code:
     83     LL k;
     84     while(scanf("%I64d%I64d",&k,&m)!=EOF){
     85         int i,j;
     86         //构造对应的矩阵
     87         for(i=0;i<=9;i++){
     88             scanf("%I64d",&origin.a[0][i]);
     89             origin.a[0][i]%=m;
     90         }
     91         for(i=1;i<=9;i++){
     92             for(j=0;j<=9;j++) origin.a[i][j]=0;
     93             origin.a[i][i-1]=1;
     94         }
     95         //初始化res为单位矩阵
     96         for(i=0;i<=9;i++){
     97             for(j=0;j<=9;j++) res.a[i][j]=0;
     98             res.a[i][i]=1;
     99         }
    100         if(k<10){
    101             printf("%I64d
    ",k%m);
    102             continue;
    103         }
    104         cal(k-9);
    105         LL ans=0;
    106         for(i=0;i<=9;i++) ans+=res.a[0][i]*(9-i);
    107         ans%=m;
    108         printf("%I64d
    ",ans);
    109     }
    110     ///////////////////////////////////////////////////////////////////////
    111     return 0;
    112 }
    113 
    114 ///////////////////////////////////////////////////////////////////////////
    115 /*
    116 Testcase:
    117 Input:
    118 10 9999
    119 1 1 1 1 1 1 1 1 1 1
    120 20 500
    121 1 0 1 0 1 0 1 0 1 0
    122 Output:
    123 45
    124 104
    125 */
    126 ///////////////////////////////////////////////////////////////////////////
  • 相关阅读:
    120. Triangle
    Effective C++ 条款36 绝不重新定义继承而来的non-virtual函数
    Effective C++ 条款31 将文件中间的编译依存关系降至最低
    Effective C++ 条款35 考虑virtual函数以外的其他选择
    Effective C++ 条款34 区分接口继承和实现继承
    Effective C++ 条款33 避免遮掩继承而来的名称
    Effective C++ 条款32 确定你的public继承塑模出is-a关系
    Effective C++ 条款30 透彻了解inlining的里里外外
    Effective C++ 条款29 为"异常安全"而努力是值得的
    Effective C++ 条款28 避免返回handles指向对象内部成分
  • 原文地址:https://www.cnblogs.com/linqiuwei/p/3318675.html
Copyright © 2020-2023  润新知