HDU 1757 A Simple Math Problem(矩阵快速幂)

题目链接

题意 :给你m和k, 让你求f(k)%m。如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… + a9 * f(k-10);
思路 :先具体介绍一下矩阵快速幂吧,刚好刚刚整理了网上的资料。可以先了解一下这个是干嘛的,怎么用。

这个怎么弄出来的我就不说了,直接看链接吧,这实在不是我强项,点这儿这儿也行

 1 //HDU 1757
 2 #include <iostream>
 3 #include <stdio.h>
 4 
 5 using namespace std;
 6 
 7 struct matrix
 8 {
 9     int m[10][10] ;
10 } b,tp,res,init ;
11 
12 int n,m ;
13 
14 matrix Mul(matrix a,matrix b)
15 {
16     matrix c ;
17     for(int i = 0 ; i < 10 ; i++)
18     {
19         for(int j = 0 ; j < 10 ; j++)
20         {
21             c.m[i][j] = 0 ;
22             for(int k = 0 ; k < 10 ; k++)
23             {
24                 c.m[i][j] += (a.m[i][k] * b.m[k][j]) % m ;
25                 c.m[i][j] %= m ;
26             }
27         }
28     }
29     return c ;
30 }
31 
32 matrix matrix_mi(matrix p,int k)
33 {
34     matrix t = res;
35     for(int i = 0 ; i <= 10 ; i++) t.m[i][i] = 1 ;
36     while(k)
37     {
38         if(k & 1)
39             t = Mul(t,p) ;
40         k >>= 1 ;
41         p = Mul(p,p) ;
42     }
43     return t ;
44 }
45 
46 void Init()
47 {
48     for(int i = 0 ; i < 10 ; i++)
49         for(int j = 0 ; j < 10 ; j++)
50             if(i-1 == j)
51                 init.m[i][j]=1;
52             else
53                 init.m[i][j]=0;
54 }
55 int main()
56 {
57     Init() ;
58     while(~scanf("%d %d",&n,&m))
59     {
60         b = init ;
61         for(int i = 0 ; i < 10 ; i++)
62             scanf("%d",&b.m[0][i]) ;
63         for(int i = 0 ; i < 10 ; i++)
64             for(int j = 0 ; j < 10 ; j++)
65                 if(i==j)
66                     res.m[i][j] = 1 ;
67                 else
68                     res.m[i][j] = 0 ;
69         if(n >= 10)
70         {
71             int sum = 0 ;
72             tp = matrix_mi(b,n-9) ;
73             for(int i = 0 ; i < 10 ; i++)
74                 sum += (tp.m[0][i] * (9-i))%m ;
75             printf("%d
",sum%m) ;
76         }
77         else printf("%d
",n%m) ;
78     }
79     return 0;
80 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3674431.html