MLE 60pts 求调
查看原帖
MLE 60pts 求调
615965
Coffins楼主2023/8/2 05:36

呃,很玄学?我没看出来哪里炸了。

#include<bits/stdc++.h>
using namespace std;
const int Max=1e6;
long long n,p,inv6,inv4;
long long f[Max+5];
int pri[Max+5],cnt=0;
bool vis[Max+5];
void Euler_Sieve(int n)
{
	vis[1]=1;
	f[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!vis[i])
		{
			pri[++cnt]=i;
			f[i]=i-1;
		}
		for(int j=1;j<=cnt&&1ll*i*pri[j]<=n;j++)
		{
			vis[i*pri[j]]=1;
			//cout<<i*pri[j]<<'\n';
			f[i*pri[j]]=f[i]*(pri[j]-1)%p;
			if(i%pri[j]==0)
			{
				f[i*pri[j]]+=f[i];
				f[i*pri[j]]%=p;
				break;
			}
		}
	}
	for(int i=2;i<=n;i++)
	{
		
		f[i]=(f[i-1]+f[i]*i%p*i%p)%p;//if(i<=2000)cout<<f[i]<<' '<<phi[i]<<"|";
	}
}
map<long long,long long> dp;
long long ksm(long long a,long long b)
{
	long long ans=1;
	a%=p;
	while(b)
	{
		if(b&1)
		{
			ans*=a;
			ans%=p;
		}
		a*=a;
		a%=p;
		b>>=1;
	}
	return ans;
}
long long inv(long long a)
{
	return ksm(a,p-2);
}
long long h(long long n)
{
	return n*(n+1)%p*(n*2%p+1)*inv6%p;
}
long long g(long long n)
{
	return n*n%p*(n+1)%p*(n+1)%p*inv4%p;
}
long long getf(long long n)
{
	if(n<=Max)
	{
		return f[n];
	}
	if(dp[n])
	{
		return dp[n];
	}
	long long ans=n*n%p*(n+1)%p*(n+1)%p*inv4%p,l=1,r=0;
	while(l<=n)
	{
		r=n/(n/l);
		ans-=(h(r)-h(l-1))%p*getf(n/l)%p;
		ans%=p; 
		l=r+1;
	}
	return dp[n]=ans;
}
int main()
{
	cin>>p>>n;
	inv4=inv(4);
	inv6=inv(6);
	Euler_Sieve(Max);
	long long ans=0,l=1,r=0;
	while(l<=n)
	{
		r=n/(n/l);
		ans+=(getf(r)-getf(l-1))%p*g(n/l)%p;
		ans%=p;
		l=r+1;
	}
	cout<<(ans+p)%p;
	return 0;
}
2023/8/2 05:36
加载中...