题目链接:1499 E. The Number of Pairs
式子: c ⋅ l c m − d ⋅ g c d = x c⋅lcm− d⋅gcd=x c⋅lcm−d⋅gcd=x
尝试一:
l
c
m
=
a
⋅
b
/
g
c
d
lcm = a· b / gcd
lcm=a⋅b/gcd,两边同乘 gcd 后变成
d
⋅
g
c
d
2
+
x
⋅
g
c
d
−
a
b
c
=
0
d·gcd^2+ x·gcd - abc = 0
d⋅gcd2+x⋅gcd−abc=0,然后尝试了
b
2
−
4
a
c
≥
0
\sqrt{b^2 - 4ac} ≥ 0
b2−4ac≥0 、
a
≥
g
c
d
,
b
≥
g
c
d
a≥gcd,b≥gcd
a≥gcd,b≥gcd 等等限制范围看能不能暴力啥的
尝试二:
暴力怎么做呢?假设gcd确定,lcm也是唯一确定的,那么就是求有多少对不同的pair(a,b) 满足
g
c
d
(
a
,
b
)
=
g
c
d
,
l
c
m
(
a
,
b
)
=
l
c
m
gcd(a,b)=gcd,lcm(a,b)=lcm
gcd(a,b)=gcd,lcm(a,b)=lcm(重名好像有点怪qwq),令
a
=
x
∗
g
c
d
,
b
=
y
∗
g
c
d
a=x*gcd, b=y*gcd
a=x∗gcd,b=y∗gcd,且x、y互质,
l
c
m
=
a
∗
b
/
g
c
d
=
x
∗
y
∗
g
c
d
lcm = a*b/gcd = x*y*gcd
lcm=a∗b/gcd=x∗y∗gcd,那就是求有多少对 (x,y) 满足 x、y互质而且
x
∗
y
=
l
c
m
g
c
d
x*y=\frac{lcm}{gcd}
x∗y=gcdlcm
首先把
l
c
m
g
c
d
\frac{lcm}{gcd}
gcdlcm 弄出来:
c
∗
l
c
m
−
d
∗
g
c
d
=
x
c*lcm− d*gcd=x
c∗lcm−d∗gcd=x
->
c
∗
l
c
m
=
d
∗
g
c
d
+
x
c*lcm=d*gcd+x
c∗lcm=d∗gcd+x
->
l
c
m
g
c
d
=
d
+
x
g
c
d
c
\frac{lcm}{gcd}=\frac{ d + \frac{x}{gcd} }{c}
gcdlcm=cd+gcdx
要使
l
c
m
g
c
d
\frac{lcm}{gcd}
gcdlcm为整数,首先
x
g
c
d
\frac{x}{gcd}
gcdx要是个整数,那
x
g
c
d
\frac{x}{gcd}
gcdx必然是
x
x
x 的因子,再判断
x
的
因
子
+
d
x_{的因子}+d
x的因子+d 能否整除
c
c
c 即可。这部分
x
\sqrt{x}
x解决
然后要求有多少对 (x,y) 满足 x、y互质而且
x
∗
y
=
k
x*y=k
x∗y=k
对
k
k
k进行素因子分解(去重),把其中一部分给
x
x
x,其它的给
y
y
y。方案数是
2
k
的
不
同
素
因
子
个
数
2^{k的不同素因子个数}
2k的不同素因子个数。但是怎么快速预处理
k
k
k 不同的素因子个数就不会了,看了题解学了手:
首先我们要知道
x
x
x的最小素因子
m
i
n
_
d
[
x
]
min\_d[x]
min_d[x],这个用埃氏筛解决,在更新时标记(线性欧拉筛也行,就是要多开个数组)
然后对于每一个
x
x
x(假设1~x之间每个数有多少不同的素因子我们已经知道了),令其最小的素因子为
j
j
j,令
k
=
x
/
i
k=x/i
k=x/i,首先
k
k
k的所有素因子必然是
x
x
x的,进一步观察可一发现
m
i
n
_
d
[
j
]
≤
m
i
n
_
d
[
k
]
min\_d[j]≤min_\_d[k]
min_d[j]≤min_d[k]:如果
k
k
k存在比
x
x
x更小的素因子,这个素因子肯定也属于
x
x
x,所以不可能。那么如果
m
i
n
_
d
[
j
]
<
m
i
n
_
d
[
k
]
min\_d[j]<min\_d[k]
min_d[j]<min_d[k] 的话?
于是就可以线性求解出来了:
num[2] = 1; num[3] = 1; num[4] = 1;
for(int i=5;i<N;i++){
// min_d[i] == -1是i为质数的情况,我这里写丑了,可以看CF官方题解的代码。
if( min_d[i] == -1 )num[i] = 1;
else{
int j = i / min_d[i];
num[i] = num[j] + (min_d[i] != min_d[j]);
}
}
CF官方题解有代码:题解