题意:求有多少(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
题解:令
i
=
g
c
d
(
a
,
b
)
i=gcd(a,b)
i=gcd(a,b),
A
=
a
/
i
A=a/i
A=a/i,
B
=
b
/
i
B=b/i
B=b/i,原式等于
c
A
B
i
−
d
i
=
x
cABi-di=x
cABi−di=x,
i
(
c
A
B
−
d
)
=
x
i(cAB-d)=x
i(cAB−d)=x,若x能整除i,则
c
A
B
=
x
i
+
d
cAB=\frac{x}{i}+d
cAB=ix+d,在讨论
x
i
+
d
\frac{x}{i}+d
ix+d能否整除c,最后转化为AB=k,其中gcd(A,B)=1,将AB质因数分解,若AB有K个不同的p,答案是
2
K
2^K
2K
#include<bits/stdc++.h>
using namespace std;
const int N=2e7+10;
typedef long long ll;
int prime[N],dp[N],cnt,cas,c,d,x;
bool isPrime[N];
ll ans=0;
void init(){
int n=2e7;cnt=0;
for(int i=2;i<=n;i++){
if(isPrime[i]==0){
prime[++cnt]=i;
dp[i]=1;
}
for(int j=1;j<=cnt && 1ll*prime[j]*i<=n;j++){
isPrime[i*prime[j]]=1;
if(i%prime[j]==0 ) dp[i*prime[j]]=dp[i];
else dp[i*prime[j]]=dp[i]+dp[prime[j]];
if(i%prime[j]==0) break;
}
}
}
int main(){
init();
scanf("%d",&cas);
while(cas--){
scanf("%d%d%d",&c,&d,&x);
// if((x+d)%c==0) ans=(1ll<<dp[(x+d)/c]);
ans=0;
for(int i=1;i*i<=x;i++){
if(x%i!=0) continue;
ll k1=(x/i)+d;
if(k1%c==0) ans+=(1ll<<dp[k1/c]);
if(i*i==x) continue;
ll k2=i+d;
if(k2%c==0) ans+=(1ll<<dp[k2/c]);
}
cout<<ans<<endl;
}
return 0;
}