给大家整个更快的取模方法
查看原帖
给大家整个更快的取模方法
50477
linfourxu楼主2021/3/31 17:42
int main()
{
	rint T=read<int>(),mod=read<int>();
	rull _=-1;_%=mod,_++;
	f[0]=ny[1]=f[1]=1;
	for(rint i=1;i<=23333;i++) sum[i]=1;
	for(rint i=2;i<=23333;i++)
	{
		rull tmp=0,lst=0;rint num=0;ny[i]=1ll*(mod-mod/i)*ny[mod%i]%mod;
		for(rint j=0;j<i;j++)
		{
			lst=tmp,tmp+=1ll*f[j]*sum[i-j];
			if(tmp<lst) num++;
		}
		rint now=(tmp+num*_)%mod;f[i]=2ll*now*ny[i]%mod;
		for(rint j=i;j<=23333;j+=i)
		{
			sum[j]+=now;
			if(sum[j]>=mod) sum[j]-=mod;
		}
	}
	for(rint tt=1;tt<=T;tt++) printf("%d\n",f[read<int>()]);
	return 0;
}

大体就是记录自然溢出次数,这样子在n^2的for循环里直接没有取模了,也不需要__int128,成功冲成最优解

2021/3/31 17:42
加载中...