样例A了,但是交上去保龄。
我推的柿子是:
an−1n−11Aann1
A=base×1000110111
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=7;
int L=3;
ll n,base=1,mod,ans;
struct Matrix
{
ll M[N][N];
void clear(){memset(M,0,sizeof(M));}
void reset(){for(int i=1;i<=L;i++)M[i][i]=1;}
Matrix(bool isT){clear();if(isT)reset();}
Matrix friend operator *(const Matrix A,const Matrix B)
{
Matrix Ans(0);
for(int i=1;i<=L;i++)
for(int j=1;j<=L;j++)
for(int k=1;k<=L;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j])%mod;
return Ans;
}
void print()
{
for(int i=1;i<=L;i++)
{
for(int j=1;j<=L;j++)
printf("%lld ",M[i][j]);
printf("\n");
}
}
};
Matrix QuickPow(Matrix T,ll p)
{
Matrix Ans(1);
while(p)
{
if(p&1)Ans=Ans*T;
T=T*T;p>>=1;
}
return Ans;
}
Matrix ANS(1),a(0);
void work(ll l,ll r)
{
printf("%lld %lld\n",l,r);
a.M[1][1]=(base*10)%mod;a.M[1][2]=a.M[1][3]=1;
a.M[2][2]=1;a.M[2][3]=1;
a.M[3][3]=1;
a=QuickPow(a,r-l+1);
ANS=ANS*a;
a.print();
}
int main(){
scanf("%lld%lld",&n,&mod);
while(base<n)work(base,min(base*10-1,n)),base*=10;
ans=ANS.M[1][3];
if(base==n)ans=(ans*(base*10)+n)%mod;
printf("%lld",ans);
return 0;
}