TLE 求助
查看原帖
TLE 求助
590600
Kreado楼主2023/5/13 12:40
#include <bits/stdc++.h>
#define ll int
using namespace std;
const ll Maxn=1e7+7,Mod=20101009;
ll mu[Maxn],sum[Maxn],prime[Maxn],cnt,p[Maxn];
bool isprime[Maxn];
inline ll f(ll x){
	return x*(x+1)/2%Mod;
}
inline void EulerSieve(ll N){
	isprime[1]=isprime[0]=1;
	mu[1]=1;
	for(ll i=2;i<=N;i++){
		if(!isprime[i]) prime[++cnt]=i,mu[i]=-1;
		for(ll j=1;j<=cnt&&prime[j]*i<=N;j++){
			isprime[prime[j]*i]=1;
			if(!(i%prime[j])) break;
			mu[prime[j]*i]=-mu[i];
		}
	}
	for(ll i=1;i<=N;i++) p[i]=p[i-1]+mu[i]*i*i,p[i]%=Mod;
}
inline ll solve(ll n,ll m){
	if(n>m) swap(n,m);
	ll res=0;
	for(ll l=1,r;l<=n;l=r+1){
		r=min(n/(n/l),m/(m/l));
		res=(res+(p[r]-p[l-1]+Mod)%Mod*f(n/l)%Mod*f(m/l)%Mod)%Mod;
	}
	return res;
}
ll n,m,ans;
int main(){
	EulerSieve(Maxn-7);
	scanf("%d%d",&n,&m);
	if(n>m) swap(n,m);
	for(ll l=1,r;l<=n;l=r+1){
		r=min(n/(n/l),m/(m/l));
		ans=(ans+(r-l+1)*(l+r)/2%Mod*solve(n/l,m/l)%Mod)%Mod;
	}
	printf("%d",ans);
	return 0;
}
/*
4 5
*/
2023/5/13 12:40
加载中...