题意:
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,a1,a2.....a9,计算f(k)%m
解题思路:
构造矩阵
矩阵a 矩阵b
0 1 0 0 0 0 0 0 0 0 f0
0 0 1 0 0 0 0 0 0 0 f1
0 0 0 1 0 0 0 0 0 0 f2
0 0 0 0 1 0 0 0 0 0 f3
0 0 0 0 0 1 0 0 0 0 f4
0 0 0 0 0 0 1 0 0 0 f5
0 0 0 0 0 0 0 1 0 0 f6
0 0 0 0 0 0 0 0 1 0 f7
0 0 0 0 0 0 0 0 0 1 f8
a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 f9
结果就是k-9个矩阵a相乘后再乘以矩阵b
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
int k,m;
struct matrix
{
int a[15][15];
};
matrix mul(matrix a,matrix b)
{
matrix ret;
memset(ret.a,0,sizeof(ret,a));
for(int i=0;i<10;i++)
{
for(int k=0;k<10;k++)
if(a.a[i][k])
for(int j=0;j<10;j++)
if(b.a[k][j])
ret.a[i][j] = (ret.a[i][j]+a.a[i][k]*b.a[k][j])%m;
}
return ret;
}
matrix mpower(matrix a,int x)
{
matrix I;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
I.a[i][j] = (i==j);
while(x)
{
if(x&1) I = mul(I,a);
x>>=1;
a = mul(a,a);
}
return I;
}
int main()
{
matrix a;
while(cin>>k>>m)
{
memset(a.a,0,sizeof(a.a));
a.a[0][1] = a.a[1][2] = a.a[2][3] = a.a[3][4] = a.a[4][5] = 1;
a.a[5][6] = a.a[6][7] = a.a[7][8] = a.a[8][9] = 1;
for(int i=9;i>=0;i--)
{
cin>>a.a[9][i];
}
matrix tem;
if(k<10) cout<<k%m<<endl;
else
{
for(int i=0;i<10;i++)
{
tem.a[i][0]=i;
}
a = mpower(a,k-9);
int sum = 0;
for(int i=0;i<10;i++)
{
sum = (sum+a.a[9][i]*tem.a[i][0])%m;
}
cout<<sum%m<<endl;
}
}
return 0;
}