求助60pts,WAon#2#8#9#10,玄关
查看原帖
求助60pts,WAon#2#8#9#10,玄关
870011
Soh_paramEEMS楼主2024/5/10 13:37

rt

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=8e6;
ll N=8e6;
void fastread()
{
	ios::sync_with_stdio(0);
}
ll np,p[M+9],phi[M+9],Sphi[M+9],inv2,inv6;
bool isp[M+9];
ll mod,n,ans;
map<ll,ll>mp;
ll qpow(ll x,ll k)
{
	ll res=1;
	while(k)
	{
		if(k&1)res=res*x%mod;
		x=x*x%mod;
		k>>=1;
	}
	return res;
}
void get()
{
	memset(isp,1,sizeof(isp));
	isp[1]=0;
	phi[1]=1;
	for(ll i=2;i<=N;i++)
	{
		if(isp[i])
		{
			p[++np]=i;
			phi[i]=i-1;
		}
		for(ll j=1;j<=np&&i*p[j]<=N;j++)
		{
			ll x=i*p[j];
			isp[x]=0;
			if(i%p[j]!=0)phi[x]=phi[i]*(p[j]-1)%mod;
			else 
			{
				phi[x]=phi[i]*p[j]%mod;
				break;
			}
		}
	}
	for(ll i=1;i<=N;i++)
	Sphi[i]=(Sphi[i-1]+phi[i]*i%mod*i%mod)%mod;
}
ll S(ll x)
{
	x%=mod;
	return x*(x+1)%mod*inv2%mod;
}
ll S2(ll x)
{
	x%=mod;
	return x*(x+1)%mod%(2*x+1)%mod*inv6%mod;
}
ll cal(ll x)
{
	if(x<=N)return Sphi[x];
	if(mp[x])return mp[x];
	ll res=S(x)%mod;
	res=res*res%mod;
	for(ll l=2,r;l<=x;l=r+1)
	{
		r=x/(x/l);
		ll tem=((S2(r)-S2(l-1))%mod+mod)%mod;
		res=(res-cal(x/l)*tem%mod+mod)%mod;
	}
	res=(res+mod)%mod;
	mp[x]=res;
	return res;
}
int main()
{
	scanf("%lld%lld",&mod,&n);
	N=min(N,n);
	get();
	inv2=qpow(2,mod-2);
	inv6=qpow(6,mod-2);
	for(ll l=1,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ll tem=S(n/l);
		tem=tem*tem%mod;
		ans=(ans+tem*(cal(r)-cal(l-1)+mod)%mod+mod)%mod;
	}
	printf("%lld",(ans+mod)%mod);
	return 0;
}
2024/5/10 13:37
加载中...