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\n",sum%m) ;

76         }

77         else printf("%d\n",n%m) ;

78     }

79     return 0;

80 }
View Code

 

你可能感兴趣的:(simple)