hdu 1757 A Simple Math Problem 매트릭스 쾌속 멱

9709 단어 simple
제목 링크: http://acm.hdu.edu.cn/showproblem.php?pid=1757
Lele now is thinking about a simple function f(x).
If x < 10 f(x) = x.
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
And ai(0<=i<=9) can only be 0 or 1 .
Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.
Input
The problem contains mutiple test cases.Please process to the end of file.
In each case, there will be two lines.
In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
In the second line , there are ten integers represent a0 ~ a9.
Output
For each case, output f(k) % m in one line.
제목 설명: 이 제목 의 뜻 은 별 말씀 이 없 으 시 죠? 그 공식 에서 보 듯 이 k 와 m 를 제시 하고 f (k)% m 를 구하 세 요.
알고리즘 분석: k 가 이렇게 큰 것 을 보면 폭력 은 안 될 것 입 니 다. 여 기 는 행렬 의 빠 른 속도 로 사용 해 야 합 니 다.
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<cmath>

 6 #include<algorithm>

 7 #define inf 0x7fffffff

 8 using namespace std;

 9 

10 int K,m;

11 struct matrix

12 {

13     int an[12][12];

14 }temp;

15 

16 matrix multiply(matrix a,matrix b)

17 {

18     matrix c;

19     memset(c.an,0,sizeof(c.an));

20     for (int i=1 ;i<=10 ;i++)

21     {

22         for (int j=1 ;j<=10 ;j++)

23         {

24             for (int k=1 ;k<=10 ;k++)

25             {

26                 c.an[i][j]=(c.an[i][j]+a.an[i][k] * b.an[k][j])%m;

27                 c.an[i][j] %= m;

28             }

29         }

30     }

31     return c;

32 }

33 

34 int calc(int u)

35 {

36     matrix x;

37     memset(x.an,0,sizeof(x.an));

38     for (int j=1 ;j<=10 ;j++) x.an[j][1]=10-j;

39     while (u)

40     {

41         if (u&1) x=multiply(temp,x);

42         u >>= 1;

43         temp=multiply(temp,temp);

44     }

45     int sum=0;

46     return x.an[1][1]%m;

47 }

48 

49 int main()

50 {

51     while (scanf("%d%d",&K,&m)!=EOF)

52     {

53         for (int i=1 ;i<=10 ;i++) scanf("%d",&temp.an[1][i]);

54         if (K<=9) {printf("%d
",K);continue; } 55 for (int i=2 ;i<=10 ;i++) 56 { 57 for (int j=1 ;j<=10 ;j++) 58 temp.an[i][j]= i==j+1 ? 1 : 0 ; 59 } 60 printf("%d
",calc(K-9)); 61 } 62 return 0; 63 }

좋은 웹페이지 즐겨찾기