pts50求调
查看原帖
pts50求调
819004
lostinue楼主2024/5/4 08:45
#include<bits/stdc++.h>
#define ll unsigned long long
#define debug printf("ciallo\n")
#define rep(i,aaa,bbb) for(int i=(aaa);i<=(bbb);i++)
#define per(i,aaa,bbb) for(int i=(aaa);i>=(bbb);i--)
#define pb push_back
using namespace std;

ll read(){
	ll f=1,x=0;
	char c=getchar();
	while(c>'9'||c<'0'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}

ll n,mod;

struct M{
	ll m[4][4];
	void init(int p=0){
		rep(i,0,3)rep(j,0,3){
			m[i][j]=0;
		}
		rep(i,1,3)m[i][i]=p;
	}
	M operator * (M const &o)const{
		M ans;
		ans.init();
		rep(i,1,3)rep(j,1,3)rep(k,1,3){
			ans.m[i][j]=(ans.m[i][j]+m[i][k]*o.m[k][j]%mod)%mod;
		}
		return ans;
	}
	M pow(ll k){
		M ans,e;
		ans.init(1);
		rep(i,0,3)rep(j,0,3){
			e.m[i][j]=m[i][j];
		}
		while(k){
			if(k&1)ans=ans*e;
			e=e*e;
			k=k>>1;	
		}
		return ans;
	}
};

int main(){
	n=read(),mod=read();
	ll x=0;
	ll i=10;
	ll k=9;
	while(n>=k){
		M e;
		e.init(),e.m[1][1]=i%mod,e.m[1][2]=e.m[2][2]=e.m[2][3]=e.m[3][3]=1;
		e=e.pow(k);
		x=x*e.m[1][1]%mod+(i/10)*e.m[1][2]%mod+e.m[1][3]%mod;
		x%=mod;
		i=i*10;
		n-=k;
		k*=10;
	}
	M e;
	e.init(),e.m[1][1]=i,e.m[1][2]=e.m[2][2]=e.m[2][3]=e.m[3][3]=1;
	e=e.pow(n);
	x=x*e.m[1][1]%mod+(i/10)*e.m[1][2]%mod+e.m[1][3]%mod;
	printf("%lld",x%mod);
	return 0;
}
2024/5/4 08:45
加载中...