GCD and LCM
Problem Description
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
Sample Output
Source
2013 ACM-ICPC吉林通化全国邀请赛——题目重现
定理:每一个合数都可以由若干质数相乘得到
题目给出gcd(x,y,z)和lcm(x,y,z),分别为g和l
1,l%g==0
2.g分解质因数中出现的质数必定在l分解质因数时出现
3.L/G=p1^t1*p2^t2*p3^t3……
x/G=p1^i1*p2^i2*p3^i3
y/G=p1^j1*p2^j2*p3^j3
z/G=p1^k1*p2^k2*p3^k3
对质数p1分析 i1,j1,k1中必然有一个是0,有一个是t1,另一个0~t1,总共6*t1种情况
故总数为6*t1*6*t2*……
先筛法求素数
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define LL __int64
const int N = 100000;
bool a[N];
int p[N];
int num;
void Prime()
{
memset(a,0,sizeof(a));
int i,j;
for(i=2;i<=N;i++)
{
if(!(a[i]))
p[num++]=i;
for(j=0;j<num&&i*p[j]<N;j++)
{
a[i*p[j]]=1;
if(!i%p[j])
break;
}
}
}
int main()
{
int T,g,l,t,i;
num=0;
Prime();
LL ans;
while(~scanf("%d",&T))
{
while(T--)
{
ans=1;
scanf("%d%d",&g,&l);
if(l%g)
{
cout<<"0"<<endl;
continue;
}
t=l/g;
for(i=0;i<num;i++)
{
if(p[i]>t)
break;
LL a=0;
while(t%p[i]==0)
{
a++;
t/=p[i];
}
if(a)
{
ans=ans*6*a;
}
}
if(t>1)
ans*=6;
cout<<ans<<endl;
}
}
return 0;
}
x=p1^i1*p2^i2*p3^i3
x=p1^i1*p2^i2*p3^i3