社区讨论

TLE求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lu8bp0r8
此快照首次捕获于
2024/03/26 19:58
2 年前
此快照最后确认于
2024/03/26 20:51
2 年前
查看原帖
Subtask1 的两个点 T 了,不知道怎么卡过去
CPP
#include<bits/stdc++.h>
#define LL long long
LL n,m;
LL TEN[19]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000,10000000000000,100000000000000,1000000000000000,10000000000000000,100000000000000000,1000000000000000000};
LL st[4]={0,1,0,0};
struct mat{
	LL M[4][4];
	void zero(){memset(M,0,sizeof(M));}
	void one()
	{
		memset(M,0,sizeof(M));
		for(int i=1;i<=3;++i)
			M[i][i]=1;
	}
	void init(int len)
	{
		memset(M,0,sizeof(M));
		for(int i=1;i<=3;++i)
			M[1][i]=1;
		for(int i=2;i<=3;++i)
			M[2][i]=1;
		M[3][3]=TEN[len]%m;
	}
	mat operator * (const mat &s)const{
		mat tmp;
		memset(tmp.M,0,sizeof(tmp.M));
		for(register int k=1;k<=3;++k)
		{
			for(register int i=1;i<=3;++i)
			{
				if(!M[i][k])
					continue;
				for(register int j=1;j<=3;++j)
				{
					tmp.M[i][j]+=M[i][k]*s.M[k][j]%m;
					tmp.M[i][j]%=m;
				}
			}
		}
		return tmp;
	}
}G;
mat power(mat SAM,LL x)
{
	mat res;
	res.one();
	while(x)
	{
		if(x&1)
			res=res*SAM;
		x>>=1;
		if(x)
			SAM=SAM*SAM;
	}
	return res;
}
inline void update()
{
	LL tmp1=0,tmp2=0,tmp3=0;
	for(register int i=1;i<=3;++i)
		tmp1=(tmp1+st[i]*G.M[i][1]%m)%m;
	for(register int i=1;i<=3;++i)
		tmp2=(tmp2+st[i]*G.M[i][2]%m)%m;
	for(register int i=1;i<=3;++i)
		tmp3=(tmp3+st[i]*G.M[i][3]%m)%m;
	st[1]=tmp1,st[2]=tmp2,st[3]=tmp3;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(register int i=1;TEN[i-1]<=n;++i)
	{
		LL T=TEN[i]>n?n-TEN[i-1]+1ll:TEN[i]-TEN[i-1];
		G.init(i);
		G=power(G,T);
		update();
	}
	printf("%lld",st[3]);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...