地址:
点击打开链接
这个题的难点在于如果之前你没有这方面经验的话,估计很难构造这个矩阵,会了构造之后,会写快速矩阵就OK了。
代码如下:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define MAX 100000002
#define repf(i,a,b) for(int i = a ; i<= b ; i++)
typedef long long ll ;
const int N= 0 ;
const int SIZE =10;
struct Mat{
ll v[SIZE][SIZE];
Mat(){
memset(v,0,sizeof(v));
}
void init()
{
repf(i,0,SIZE-1)
v[i][i]=1;
}
}r;
int l ,MOD;
Mat operator *(Mat a ,Mat b)
{
Mat c ;
repf(i,0,SIZE-1)
{
repf(j,0,SIZE-1)
{
c.v[i][j]=0;
repf(k,0,SIZE-1)
{
c.v[i][j]+=(a.v[i][k]*b.v[k][j])%MOD;
c.v[i][j]%=MOD;
}
}
}
return c ;
}
Mat operator ^(Mat a,ll k)
{
Mat c ;
c.init();
while(k)
{
if(k&1)
{
c = a*c;
}
a=a*a;
k>>=1;
}
return c ;
}
int main(){
Mat a ,c ;
while(scanf("%d%d",&l,&MOD)!=EOF)
{
repf(i,0,SIZE-1)
{
scanf("%d",&r.v[0][i]);
a.v[i][0] =9-i ;//我的天,我一开始把顺序写反了,卡了我快一个小时,我的天!!!
}
if(l<10)
{
printf("%d\n",l%MOD);
continue ;
}else {
repf(i,1,SIZE-1)
{
r.v[i][i-1]=1;
}
Mat c = r^(l-9);
printf("%I64d\n",(c*a).v[0][0]%MOD);
}
}
}