如果G%L != 0,说明一定无解。
把K = G / L质数分解,G / L = p1^t1 * p2^t2 * p3^t3 * ……;同时 x/= L, y/= L, z/=L,不影响结果。
假设三个数字的质数分解是:
x = p1^i1 * p2^i2 * p3^i3 * ……
y = p1^j1 * p2^j2 * p3^j3 * ……
z = p1^k1 * p2^k2 * p3^k3 * ……
要保证x, y, z互质,并且lcm(x, y, z) = K, 那么对于p1来说,i1, j1, k1里面一定有一个是0,并且一定有一个是t1,所以有3种情况:
0 0 t1 有3种
t1 t1 0 有3种
t1 0 1~t1-1 有(t1-1)*6种
一共是6*t1种。
根据乘法原理,总的种数是:6*t1 + 6*t2 + ……
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std ;
#define MAX 10000100
bool visit[MAX] ;
long long prime[MAX / 10] ;
int tot = 0 ;
void doprime()//素数筛
{
for(long long i = 2 ; i < MAX ; i ++)
{
if(! visit[i])
{
prime[tot ++] = i ;
for(long long j = i * i ; j < MAX ; j += i) visit[j] = true ;
}
}
}
int p[1000] ;//素因子
int a[1000] ;//素因子个数
int cnt ;
void sbreak(long long n)//素因子分解
{
memset(p , 0 , sizeof(p)) ;
memset(a , 0 , sizeof(a)) ;
cnt = 0 ;
for(int i = 0 ;prime[i] * prime[i] <= n ; i ++)
{
if(n % prime[i] == 0)
{
p[cnt] = prime[i] ;
while(n % prime[i] == 0)
{
a[cnt] ++ ;
n /= prime[i] ;
}
cnt ++ ;
}
}
if(n != 1)
{
p[cnt] = n ;
a[cnt ++ ] = 1 ;
}
}
int main()
{
int T ;
int G , L ;
cin >> T ;
doprime() ;
while(T -- )
{
cin >> G >> L ;
if(L % G )
{
printf("0\n");
continue ;
}
int num = L / G ;
sbreak(num) ;
int ans = 1 ;
for(int i = 0 ; i < cnt ; i ++)
{
ans *= (a[i] * 6) ;
}
printf("%d\n", ans);
}
return 0 ;
}