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\n",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\n",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 ///////////////////////////////////////////////////////////////////////////

posted on 2013-09-13 11:03  SCNU20102200088  阅读(182)  评论(0编辑  收藏  举报

导航