题目链接
https://lydsy.com/JudgeOnline/problem.php?id=2154
https://lydsy.com/JudgeOnline/problem.php?id=2693
题解
其中
考虑
满足以下条件
因此可以线筛求出,答案可以整除分块。
代码
BZOJ 2154
#include <cstdio>
#include <algorithm>
int read()
{
int x=0,f=1;
char ch=getchar();
while((ch<'0')||(ch>'9'))
{
if(ch=='-')
{
f=-f;
}
ch=getchar();
}
while((ch>='0')&&(ch<='9'))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int maxn=10000000;
const int mod=20101009;
int p[maxn+10],prime[maxn+10],cnt,f[maxn+10],sum[maxn+10];
int getprime()
{
p[1]=1;
f[1]=1;
for(int i=2; i<=maxn; ++i)
{
if(!p[i])
{
prime[++cnt]=i;
f[i]=1-i;
}
for(int j=1; (j<=cnt)&&(i*prime[j]<=maxn); ++j)
{
p[i*prime[j]]=1;
if(i%prime[j]==0)
{
f[i*prime[j]]=f[i];
break;
}
f[i*prime[j]]=1ll*f[i]*(mod+1-prime[j])%mod;
}
}
for(int i=1; i<=maxn; ++i)
{
sum[i]=(sum[i-1]+1ll*f[i]*i)%mod;
}
return 0;
}
int n,m,ans;
int S(int x)
{
return (1ll*x*(x+1)/2)%mod;
}
int main()
{
getprime();
n=read();
m=read();
for(int l=1,r; l<=std::min(n,m); l=r+1)
{
r=std::min(n/(n/l),m/(m/l));
ans=(ans+1ll*(sum[r]-sum[l-1]+mod)*S(n/l)%mod*S(m/l))%mod;
}
printf("%d\n",ans);
return 0;
}
BZOJ 2693
#include <cstdio>
#include <algorithm>
int read()
{
int x=0,f=1;
char ch=getchar();
while((ch<'0')||(ch>'9'))
{
if(ch=='-')
{
f=-f;
}
ch=getchar();
}
while((ch>='0')&&(ch<='9'))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int maxn=10000000;
const int mod=100000009;
int p[maxn+10],prime[maxn+10],cnt,f[maxn+10],sum[maxn+10];
int getprime()
{
p[1]=1;
f[1]=1;
for(int i=2; i<=maxn; ++i)
{
if(!p[i])
{
prime[++cnt]=i;
f[i]=1-i;
}
for(int j=1; (j<=cnt)&&(i*prime[j]<=maxn); ++j)
{
p[i*prime[j]]=1;
if(i%prime[j]==0)
{
f[i*prime[j]]=f[i];
break;
}
f[i*prime[j]]=1ll*f[i]*(mod+1-prime[j])%mod;
}
}
for(int i=1; i<=maxn; ++i)
{
sum[i]=(sum[i-1]+1ll*f[i]*i)%mod;
}
return 0;
}
int T,n,m,ans;
int S(int x)
{
return (1ll*x*(x+1)/2)%mod;
}
int main()
{
getprime();
T=read();
while(T--)
{
n=read();
m=read();
ans=0;
for(int l=1,r; l<=std::min(n,m); l=r+1)
{
r=std::min(n/(n/l),m/(m/l));
ans=(ans+1ll*(sum[r]-sum[l-1]+mod)*S(n/l)%mod*S(m/l))%mod;
}
printf("%d\n",ans);
}
return 0;
}