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,成功冲成最优解