解题思路
矩阵乘法。
代码:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#define ll long long
using namespace std;
ll n,p,now=0;
struct ldx{
ll s[4][4];
ldx() {memset(s,0,sizeof(s));}
ldx operator * (const ldx &t) const{
ldx r1;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
r1.s[i][j]=(r1.s[i][j]+s[i][k]*t.s[k][j] %p) %p;
return r1;
}
}rc;
ldx mi(ldx x,ll num){
if(num==1) return x;
ldx j=mi(x,num/2);
if(num&1) return j*j*x;
else return j*j;
}
int main(){
ll S=0,X=1,C=1;
scanf("%lld%lld",&n,&p);
rc.s[1][1]=rc.s[2][1]=rc.s[2][2]=rc.s[3][2]=rc.s[3][3]=1;
while(now<n){
ll to=now*10+9;to=min(to,n);
rc.s[1][1]=rc.s[1][1]*10%p;
ldx r=mi(rc,to-now);now=to;
ll ai=(S*r.s[1][1]%p+X*r.s[2][1]%p+C*r.s[3][1]%p)%p;
ll bi=(S*r.s[1][2]%p+X*r.s[2][2]%p+C*r.s[3][2]%p)%p;
ll ci=(S*r.s[1][3]%p+X*r.s[2][3]%p+C*r.s[3][3]%p)%p;
S=ai;X=bi;C=ci;
}
printf("%lld",S);
return 0;
}