题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757
题目大意:
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);
给出k,m和a0~a9,求f(k)%m, k<2*10^9 , m < 10^5
这是一个递推式,故可以用矩阵乘法来求
和上题类似,具体思路过程见上题。
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; const int MAX = 15; struct Matrix { int v[MAX][MAX]; }; int n=10,M; Matrix mtMul(Matrix A, Matrix B) // 求矩阵 A * B { int i, j, k; Matrix C; for(i = 0; i < n; i ++) for(j = 0; j < n; j ++) { C.v[i][j] = 0; for(k = 0; k < n; k ++) C.v[i][j] = (A.v[i][k] * B.v[k][j] + C.v[i][j]) % M; } return C; } Matrix mtPow(Matrix origin,int k) //矩阵快速幂 { int i; Matrix res; memset(res.v,0,sizeof(res.v)); for(i=1;i<=n;i++) res.v[i][i]=1; while(k) { if(k&1) res=mtMul(res,origin); origin=mtMul(origin,origin); k>>=1; } return res; } void out(Matrix A) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<A.v[i][j]<<" "; cout<<endl; } cout<<endl; } int main () { int num; while(~scanf("%d%d",&num,&M)) { Matrix A; memset(A.v,0,sizeof(A.v)); for(int i=0;i<10;i++) A.v[0][i]=i; //out(A); Matrix ans; memset(ans.v,0,sizeof(ans.v)); for(int i=0;i<10;i++) ans.v[i+1][i]=1; for(int i=9;i>=0;i--) scanf("%d",&ans.v[i][9]); //out(ans); ans=mtPow(ans,num); A=mtMul(A,ans); cout<<A.v[0][0]<<endl; } }
矩阵十题【八】 HDU 1715 A Simple Math Problem
时间: 2024-12-11 11:55:36