hdu 4497
题目大意:
已知
gcd(x,y,z)=G,lcm(x,y,z)=L
;求这样的x, y, z有几种,其中
(1,2,3)(3,2,1)
算两种;
思路:
因式分解
G=ap11∗ap22∗...∗apkk
;
L=aq11∗aq22∗...∗aqss
;
(qi>pi)
L%G!=0,ans=0
;
m=L/G=br11∗br22∗...∗brtt
;
X=x/G=bn11∗bn22∗...∗bntt
;
同理:
Y=∏i=1tbmii
,
Z=∏i=1tboii
,
min(ni,mi,oi)=0
,
max(ni,mi,oi)=ri
,且
X,Y,Z
中对因子
bi
,必定为
(0,ri,0∼ri)
,即一个一定为
0
个,一个为
(0,0,ri)
3种;
(0,ri,ri)
3种;
(0,ri,1∼ri−1)
6种;
即每个因子共有
6∗ri
种排列;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define N 200005
using namespace std;
bool not_prime[N];
int prim[N];
void init()
{
memset(not_prime, 0, sizeof(not_prime));
prim[1] = 0;
int cnt = 0;
for(int i = 2; i < N; i++)
{
if(!not_prime[i])
{
prim[cnt++] = i;
for(int j = i + i; j < N; j += i)
{
not_prime[j] = 1;
}
}
}
}
void get(int m)
{
int ans = 1;
for (int i = 0; prim[i] * prim[i] <= m; i++)
{
if (m % prim[i] == 0)
{
int cnt = 0;
while (m % prim[i] == 0)
{
cnt++;
m /= prim[i];
}
ans *= 6 * cnt;
}
}
if (m > 1)
{
ans *= 6;
}
printf("%d\n", ans);
}
int main()
{
init();
int T;
scanf("%d", &T);
while (T--)
{
int gcd, lcm;
scanf("%d%d", &gcd, &lcm);
if (lcm % gcd != 0)
{
printf("0\n");
continue;
}
int m = lcm / gcd;
get(m);
}
return 0;
}