P2257
T T T 组数据。
给定 N , M N,M N,M ,求 1 ≤ x ≤ N , 1 ≤ y ≤ M 1\le x \le N,1\le y \le M 1≤x≤N,1≤y≤M , gcd ( x , y ) \text{gcd}(x,y) gcd(x,y) 为质数的对数。
T ≤ 1 0 4 , N , M ≤ 1 0 7 T\le 10^4\ , \ N,M\le 10^7 T≤104 , N,M≤107
Solution
根据题意,其实是求(假设
n
<
m
n<m
n<m ):
∑
i
=
1
n
∑
j
=
1
m
[
gcd
(
i
,
j
)
∈
P
r
i
m
e
]
\sum_{i=1}^n\sum_{j=1}^{m}[\text{gcd}(i,j)\in Prime]
i=1∑nj=1∑m[gcd(i,j)∈Prime]
化简式子,先枚举质数:
∑
p
∈
P
r
i
m
e
∑
i
=
1
n
∑
j
=
1
m
[
gcd
(
i
,
j
)
=
=
p
]
\sum_{p\in Prime}\sum_{i=1}^{n}\sum_{j=1}^{m}[\text{gcd}(i,j)==p]
p∈Prime∑i=1∑nj=1∑m[gcd(i,j)==p]
同时除以
p
p
p:
∑
p
∈
P
r
i
m
e
∑
i
=
1
⌊
n
p
⌋
∑
j
=
1
⌊
m
p
⌋
[
gcd
(
i
,
j
)
=
=
1
]
\sum_{p\in Prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[\text{gcd}(i,j)==1]
p∈Prime∑i=1∑⌊pn⌋j=1∑⌊pm⌋[gcd(i,j)==1]
我们知道
ϵ
(
x
)
=
{
1
x
=
1
0
otherwise
\epsilon (x)=\begin{cases}1\ \ \ \ x=1\\0\ \ \ \ \text{otherwise}\end{cases}
ϵ(x)={1 x=10 otherwise
而 ϵ = μ ∗ 1 = ∑ d ∣ n μ ( d ) \epsilon = \mu \ *\ 1=\large\sum\limits_{d|n}\normalsize\mu(d) ϵ=μ ∗ 1=d∣n∑μ(d)
故 ∑ p ∈ P r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ m p ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) \sum_{p\in Prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\sum_{d|\text{gcd}(i,j)}\mu(d) p∈Prime∑i=1∑⌊pn⌋j=1∑⌊pm⌋d∣gcd(i,j)∑μ(d)
先枚举
d
d
d :
∑
p
∈
P
r
i
m
e
∑
d
=
1
⌊
n
p
⌋
μ
(
d
)
⋅
⌊
n
p
d
⌋
⋅
⌊
m
p
d
⌋
\sum_{p\in Prime}\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\cdot\lfloor\cfrac{n}{pd}\rfloor\cdot\lfloor\cfrac{m}{pd}\rfloor
p∈Prime∑d=1∑⌊pn⌋μ(d)⋅⌊pdn⌋⋅⌊pdm⌋
优化时间复杂度的一个常规操作,令
k
=
p
d
k=pd
k=pd,枚举
k
k
k :
∑
k
=
1
n
∑
p
∈
P
r
i
m
e
,
p
∣
n
μ
(
k
p
)
⋅
⌊
n
k
⌋
⋅
⌊
m
k
⌋
\sum_{k=1}^{n}\sum_{p\in Prime,p\mid n}\mu(\cfrac{k}{p})\cdot\lfloor\cfrac{n}{k}\rfloor\cdot\lfloor\cfrac{m}{k}\rfloor
k=1∑np∈Prime,p∣n∑μ(pk)⋅⌊kn⌋⋅⌊km⌋
设 f ( n ) = ∑ p ∈ P r i m e , p ∣ n μ ( n p ) f(n)=\large\sum\limits_{p\in Prime,p\mid n}\normalsize\mu(\cfrac{n}{p}) f(n)=p∈Prime,p∣n∑μ(pn),考虑预处理
若 n ∈ P r i m e n\in Prime n∈Prime ,则 f ( n ) = − 1 f(n)=-1 f(n)=−1
否则,若 n n n 最小的质因子是 r r r ,则
若 r 2 ∣ n r^2\mid n r2∣n ,当 n r \cfrac{n}{r} rn 没有平方因子时, f ( n ) = μ ( n r ) f(n)=\mu(\cfrac{n}{r}) f(n)=μ(rn) , 否则 f ( n ) = 0 = μ ( n r ) f(n)=0=\mu(\cfrac{n}{r}) f(n)=0=μ(rn)
若 r 2 ∤ p r^2 \nmid p r2∤p , f ( n ) = ∑ p ∈ P r i m e , p ∣ n μ ( n p ) = μ ( n r ) + ∑ p ∈ P r i m e , p ∣ n r μ ( n p r ) μ ( r ) f(n)=\large\sum\limits_{p\in Prime,p\mid n}\normalsize\mu(\cfrac{n}{p})=\mu(\cfrac{n}{r})+\large\sum\limits_{p\in Prime,p\mid \frac{n}{r}}\normalsize\mu(\cfrac{n}{pr})\mu(r) f(n)=p∈Prime,p∣n∑μ(pn)=μ(rn)+p∈Prime,p∣rn∑μ(prn)μ(r)
即 f ( n ) = μ ( n r ) − ∑ p ∈ P r i m e μ ( n p r ) = μ ( n r ) − f ( n r ) f(n)=\mu(\cfrac{n}{r})-\large\sum\limits_{p\in Prime}\normalsize\mu(\cfrac{n}{pr})=\mu(\cfrac{n}{r})-f(\cfrac{n}{r}) f(n)=μ(rn)−p∈Prime∑μ(prn)=μ(rn)−f(rn)
在欧拉筛的时候递推计算即可。
其余部分整除分块,时间复杂度 O ( N + N ) O(N+\sqrt N) O(N+N)
AC Code
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define int long long
using namespace std;
const int SIZE=1e4+5,N=1e7+5;
int T;
int a[SIZE],b[SIZE];
int prime[N],miu[N],v[N],f[N];
int n;
void euler()
{
int m=0;miu[1]=1;
for(register int i=2;i<=n;i++)
{
if(!v[i]) v[i]=i,miu[i]=-1,f[i]=1,prime[++m]=i;
for(register int j=1;j<=m;j++)
{
if(prime[j]>v[i]||prime[j]*i>n) break;
v[i*prime[j]]=prime[j];
miu[i*prime[j]]=(i%prime[j]?-miu[i]:0);
f[i*prime[j]]=(i%prime[j]?miu[i]-f[i]:miu[i]);
}
}
}
signed main()
{
scanf("%lld",&T);
for(register int i=1;i<=T;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
if(a[i]>b[i]) swap(a[i],b[i]);
n=max(n,a[i]);
}
euler(); //数据范围较大,离线处理
for(register int i=2;i<=n;i++) f[i]+=f[i-1]; //前缀和优化
for(register int i=1;i<=T;i++)
{
int ans=0,n=a[i],m=b[i];
for(register int l=1,r=0;l<=n;l=r+1) //整除分块
{
r=min(n/(n/l),m/(m/l));
ans+=(f[r]-f[l-1])*(n/l)*(m/l);
}
printf("%lld\n",ans);
}
return 0;
}