求助临界条件
查看原帖
求助临界条件
169844
w2321楼主2021/2/23 16:20
#include<cstdio>
#include<cmath>
#define int long long
#define ri register int 
#define min(a,b) a<b?a:b
struct matrix{
	int val[4][4];
}A,B;
int v[19]={1},p;
inline int read(){
	int x=0,f=0;char c=getchar();
	while(c>'9'||c<'0') f=c=='-',c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
	return f?-x:x;
}
matrix mul(matrix a,matrix b){
	matrix c;
	for(ri i=0;i<=3;++i)
		for(ri j=0;j<=3;++j)
		{
			c.val[i][j]=0;if(!i||!j) continue;
			for(ri k=1;k<=3;++k)
				c.val[i][j]=(c.val[i][j]+a.val[i][k]*b.val[k][j]%p)%p;
		}
	return c;
}
matrix ksm(matrix B,int b){
	matrix E;
	for(ri i=1;i<=3;++i) for(ri j=1;j<=3;++j) E.val[i][j]=i==j;
	while(b)
	{
		if(b&1) E=mul(E,B);
		B=mul(B,B);
		b>>=1;
	}
	return E;
}
signed main(){
	int n=read(),ws=0,n1=n;p=read();
	while(n1) ws++,n1/=10;
	A.val[1][1]=A.val[1][2]=A.val[1][3]=1;
	B.val[2][1]=B.val[2][2]=B.val[3][1]=B.val[3][2]=B.val[3][3]=1;
	for(ri i=1;i<=ws;++i) v[i]=v[i-1]*10;
	for(ri i=1;i<ws;++i)
	{
		int l=v[i-1],r=v[i];
		B.val[1][1]=v[i]%p;
		matrix t=ksm(B,r-l-1);
		A=mul(A,t);
	}
	int l=v[ws-1],r=n;
	if(ws!=1) r+=v[ws-2];
	B.val[1][1]=v[ws]%p;
	matrix t=ksm(B,r-l);
	A=mul(A,t);
	printf("%lld",A.val[1][1]);
	return 0;
}
2021/2/23 16:20
加载中...