先看看快速幂
int t,r,n;
void liu(int n)
{
if(n==1) {r=t;return;}
liu(n/2); //递归求出 n/2 幂
r*=r; //
if(n%2==1) r*=t; //判断奇、偶
}
矩阵连乘:
If x >= 10
f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
(f(n),f(n-1),….,f(n-9))=(f(9),….f(0))* 矩阵 的n-9 次方
Hdu 1757
#include<stdio.h>
#include<string.h>
int i,j,k,n,m;
int t[10][10],r[10][10],b[10][10];
void ju(int c[10][10],int d[10][10])
{
memset(b,0,sizeof(b));
for(i=0;i<10;i++)
for(j=0;j<10;j++)
for(k=0;k<10;k++) b[i][j]+=c[i][k]*d[k][j]%m;
for(i=0;i<10;i++)
for(j=0;j<10;j++) c[i][j]=b[i][j]%m;
}
void liu(int n)
{
if(n==1) return;
liu(n/2);ju(r,r);
if(n&1) ju(r,t);
}
void main()
{
memset(t,0,sizeof(t));
for(i=0;i<9;i++) t[i][1+i]=1;
//for(i=0;i<9;) t[i][++i]=1; //不知道为什么用这个循环的时候就wa,求高手指教
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n<10) {printf("%d\n",n%m);continue;}
for(i=0;i<10;i++) scanf("%d",&t[i][0]);
memcpy(r,t,sizeof(r));
liu(n-9);
for(i=n=0;i<9;i++) n+=(9-i)*r[i][0]%m; //注意这里是 9-i
printf("%d\n",n%m);
}
}