标签:
Description
Input
Output
Sample Input
10 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
Sample Output
45 104
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define LL __int64 struct node{ LL a[12][12] ; int n ; }; node mul(node p,node q,LL m) { int i , j , k ; node s ; s.n = p.n ; for(i = 0 ; i < p.n ; i++) for(j = 0 ; j < p.n ; j++) { s.a[i][j] = 0 ; for(k = 0 ; k < p.n ; k++) s.a[i][j] = (s.a[i][j] + p.a[i][k]*q.a[k][j]) % m ; } return s ; } node pow(node p,LL k,LL m) { if( k == 1 ) return p ; node s = pow(p,k/2,m) ; s = mul(s,s,m) ; if( k%2 ) { s = mul(s,p,m) ; } return s ; } int main() { LL k , m , ans ; int i , j ; node p , s ; while( scanf("%I64d %I64d", &k, &m) != EOF ) { if(k < 10) { printf("%I64d\n", k) ; continue ; } ans = 0 ; p.n = 10 ; for(i = 0 ; i < 10 ; i++) { for(j = 0 ; j < 10 ; j++) p.a[i][j] = 0 ; p.a[i][i+1] = 1 ; } for(i = 0 ; i < 10 ; i++) scanf("%I64d", &p.a[i][0]) ; s = pow(p,k-9,m) ; for(i = 0 ; i < 10 ; i++) ans = ( ans + (9-i)*s.a[i][0] ) % m ; printf("%I64d\n", ans) ; } return 0 ; }
hdu1757-- A Simple Math Problem(矩阵快速幂优化)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/42783491