您的位置:首页 > 其它

HDU 4497 GCD and LCM

2015-08-05 14:42 288 查看
Given two positive integers G and L, could you tell me how many solutions of (x, y, z) there are, satisfying that gcd(x, y, z) = G and lcm(x, y, z) = L?

Note, gcd(x, y, z) means the greatest common divisor of x, y and z, while lcm(x, y, z) means the least common multiple of x, y and z.

Note 2, (1, 2, 3) and (1, 3, 2) are two different solutions.

Input

First line comes an integer T (T <= 12), telling the number of test cases.

The next T lines, each contains two positive 32-bit signed integers, G and L.

It’s guaranteed that each answer will fit in a 32-bit signed integer.

Output

For each test case, print one line with the number of solutions satisfying the conditions above.

Sample Input

2
6 72
7 33


Sample Output

72
0

#include <iostream>
#include <stdio.h>
using namespace std;
#define MAXN 50000
int arrp[MAXN];
int vis[MAXN];
int k;
void get_prime()
{
k=0;
vis[2]=0;
for(int i=2;i<MAXN;i++)
{
if(!vis[i])
{
arrp[k++]=i;
for(int j=i;j<MAXN;j+=i) vis[j]=1;
}
}
}
int main()
{
//freopen("data.in","r",stdin);
get_prime();
int T,g,l;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&g,&l);
if(l%g)
{
printf("0\n");
continue;
}
int tmp=l/g;
int cnt,ans=1;
for(int i=0;i<k;i++)
{
if(arrp[i]*arrp[i]>tmp) break;
if(tmp%arrp[i]!=0)  continue;
cnt=0;
while(tmp%arrp[i]==0)
{
tmp/=arrp[i];
cnt++;
}
ans*=(3+3+6*(cnt-1));
///上面三个数分别表示:
///只有一个含质该因子;有两个含该因子且均是arrp[i]^cnt;有两个含该因子且只有一个是arrp[i]^cnt,另一个有cnt-1种情况
}
if(tmp>1) ans*=(3+3+6*(1-1));
printf("%d\n",ans);
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: