トピックリンク
題名:
あなたにc、d、xc、d、xを与えますc 、d 、xはc ∗ lcm(a、b)− d ∗ gcd(a、b)= xc * lcm(a、b)-d * gcd(a、b)= xに準拠しますc∗l c m (a 、b )−d∗g c d (a 、b )=x 's(a、b)(a、b)(、b )何種類ありますか?
アイデア:
まず、c ∗ lcm(a、b)− d ∗ gcd(a、b)= xc * lcm(a、b)-d * gcd(a、b)= xに従ってc∗l c m (a 、b )−d∗g c d (a 、b )=xペイシューの定理は次のようになります。
x是gcd(lcm(a、b)、gcd(a、b))。xprepgcd(lcm(a、b)、gcd(a、b))。Xであり、G 、C 、D (L用のC M (、b )、g c d (a 、b ))。
そして、gcd(lcm(a、b)、gcd(a、b))はgcd(a、b)に等しい。そしてgcd(lcm(a、b)、gcd(a、b))はgcd(a 、b)。 そして、G 、C 、D (L用のC M (、b )、g c d (a 、B ))等でG C D (A 、b )。
したがって、gcd(a、b)はxの因数です。したがって、xの因数を列挙できます。
lcm =(x + d * gcd)/ c
lcm / gcdをもう一度見てください。これはaとbの素因数の積であることがわかります。したがって、gcd(a、 b)。
次に、lcm / gcdには合計n個の素因数があると仮定し、2n個の構築方法があります。
次に、2e7の素因数の数をふるいにかける必要があります。(同様のふるいを使用)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#include <immintrin.h>
#pragma GCC optimize(2)
#include <set>
#include <map>
#include <queue>
#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<ll, ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn = 2e7 + 10;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod = 998244353;
const int MOD = 10007;
int prime[maxn];
ll ans;
#define read read()
void init()
{
for(int i = 2; i < maxn; i++)
{
if(!prime[i])
{
for(int j = i; j < maxn; j += i)
{
prime[j]++;
}
}
}
}
void add(ll gcd,ll x,ll d,ll c)
{
ll lcm=x+d*gcd;
if(lcm%c==0)
{
lcm/=c;
if(lcm%gcd==0)
ans+=1LL<<prime[lcm/gcd];
}
}
void solve()
{
ll d,c,x;
ans=0;
scanf("%lld%lld%lld",&c,&d,&x);
for(int i=1;i<=sqrt(x);i++){
if(x%i==0){
add(i,x,d,c);
if(i*i!=x){
add(x/i,x,d,c);
}
}
}
printf("%lld\n",ans);
}
int main()
{
init();
ll t;
scanf("%lld",&t);
while(t--)
{
solve();
}
return 0;
}