E
题意:
T
T
T组数据,给定
c
,
d
,
x
c,d,x
c,d,x,问有多少数对
(
a
,
b
)
(a,b)
(a,b)满足
c
⋅
l
c
m
(
a
,
b
)
−
d
⋅
g
c
d
(
a
,
b
)
=
x
c\ ·lcm(a,b)-d\ ·gcd(a,b)=x
c ⋅lcm(a,b)−d ⋅gcd(a,b)=x
数据范围:
1
≤
c
,
d
,
x
≤
1
0
7
1\leq c,d,x\leq 10^7
1≤c,d,x≤107
题解:
对原式进行转换:
令
g
=
g
c
d
(
a
,
b
)
g=gcd(a,b)
g=gcd(a,b),则
c
⋅
a
×
b
g
−
d
⋅
g
=
x
c\ ·\frac{a\times b}{g}-d\ ·g=x
c ⋅ga×b−d ⋅g=x
当然也可以得到:
c
⋅
a
×
b
g
×
g
−
d
=
x
g
c\ ·\frac{a\times b}{g\times g}-d=\frac{x}{g}
c ⋅g×ga×b−d=gx
转换一下可得到:
a
×
b
g
×
g
=
x
g
+
d
c
\frac{a\times b}{g\times g}=\frac{\frac{x}{g}+d}{c}
g×ga×b=cgx+d
到这可以看清楚我们可以枚举 x x x的所有约数作为 g c d ( a , b ) gcd(a,b) gcd(a,b),然后可以得到一个值 v = a × b g × g v=\frac{a\times b}{g\times g} v=g×ga×b,由于除去了 g g g,故 a g \frac{a}{g} ga和 b g \frac{b}{g} gb是互质的。考虑将一个数 v v v分解质因数,共有 n n n个不同的质因子,故如果要保证对 v v v分解成两个互质的数,则分解得到的两个数的质因子不能有交集,因此质因子有两种分配选择,故每个 v v v对应的方案就是 2 n 2^n 2n。
因此预处理出每个数的质因子个数即可,考虑埃筛筛出所有质因子即可。
注意由于这里的 v v v最大可能是两个 1 0 7 10^7 107级别的数之和,故需要筛到 2 × 1 0 7 2\times 10^7 2×107。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e7;
int cnt[N + 1];
int c, d, x;
ll ans;
void init() {
for(int i = 2; i <= N; ++i)
if(!cnt[i]) for(int j = i; j <= N; j += i)
cnt[j] += 1;
}
ll cal(int g) {
int num = d + (x / g);
if(num % c) return 0;
return 1ll << cnt[num / c];
}
void solve() {
ans = 0;
scanf("%d%d%d", &c, &d, &x);
for(int i = 1; i * i <= x; ++i)
if(x % i == 0) {
ans += cal(i);
if(i * i != x) ans += cal(x / i);
}
printf("%lld\n", ans);
}
int main()
{
init();
int T; scanf("%d", &T);
while(T--) solve();
return 0;
}