题目链接: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,布布扣,bubuko.com
矩阵十题【八】 HDU 1715 A Simple Math Problem
原文地址:http://blog.csdn.net/u010468553/article/details/38493439