题意:已知三个数的gcd和lcm,求满足这个条件的三个的组数,顺序可以不同
思路:gcd(x,y,z) == G, lcm(x,y,z) == L,则gcd( x', y',z') == 1,lcm(x',y',z') == L/G ,其中x' = x /G,y' = y /G ,z' = z / G;
这样的话对t = L/G 这个数进行素因子分解,t = p1^t1 * p2^t2 * p3^t3 ..... * pn ^tn;
满足上面条件的x,y,z一定为这样的形式。
x' = p1^i1 * p2^i2 *```* pn^in.
y' = p1^j1 * p2^j2 * ```*pn^jn.
z' = p1^k1 * p2^k2 * ```*pn^kn.
为了满足上面的条件,对于p1,一定有max(i1,j1,k1) = t1.min(i1,j1,k1) =0;因为gcd(p1^i1,p1^j1,p1^k1)== 1 == p^0, => min(i1,j1,k1) == 0;
同理:lcm(p1^i1,p1^j1,p1^k1) == p1^t1 => max(i1,j1,k1) == t1;那么的话三个数中至少有一个0,和一个t1,第三个数则是在[0, t1]这个区间里的一个数;
则当选定第一个数为0,第二个数为t1时,第三个数可以为【0,t1】,又由于有顺序的,只有(0,t1,t1) 和(0,t1,0)这两种情形根据顺序只能产生三种结果,其他的第三个数在在【1,n-1】这个区间由于三个数都不一样,一定能产生6种,所以最后产生了6*(t1-1)+3*2 = 6*t1种,根据乘法原理以及关于素数分解的唯一性,反过来,素数组合必然也是唯一的数,一共有6*t1 * 6*t2 *`````*6*tn种选法。
接下来就是代码了:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll depart(ll n)
{
ll ans = 1;
for(int i = 2; i * i <= n; i ++)
{
if(n % i == 0)
{
int t = 0;
while(n % i == 0)
{
t ++;
n /= i;
}
ans *= t * 6;
}
}
if(n > 1)
ans *= 6;
return ans;
}
int main()
{
int Tcase;
scanf("%d",&Tcase);
for(int ii = 1; ii <= Tcase; ii ++)
{
ll n,m;
scanf("%I64d%I64d",&n,&m);
if(m % n)
{
cout << 0 << endl;
continue;
}
ll t = m /n;
cout << depart(t) << endl;
}
return 0;
}