现在的位置: 首页 > 综合 > 正文

hdu4497 GCD and LCM

2013年09月06日 ⁄ 综合 ⁄ 共 1385字 ⁄ 字号 评论关闭

GCD and LCM

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 78 Accepted Submission(s): 43

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
2 6 72 7 33

Sample Output
72 0

Source

Recommend
liuyiding
很明显,m/n!=0的话,就直接输出0就可以了!否刚,直接分解质因数m/n,找到,每个质因子的个数,这样,我们,就可以得出每个质因数为a1^k1,那是题目就是要把这k1个a1分到三个数中,那么排列组合就是k1*A(3,2),也就是,6*k1,种,直接算出来就行了!
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
#define MAXN 100000
int num[MAXN];
int main()
{
    int tcase,n,m,i,ans,sum,tempm;
    scanf("%d",&tcase);
    while(tcase--)
    {
        scanf("%d%d",&n,&m);
        memset(num,0,sizeof(num));
        if(m%n!=0)
        {
            printf("0\n");
            continue;
        }
        m=m/n;tempm=sqrt(m)+1;
        for(i=2,ans=0;i<=tempm;i++)
        {
            if(m%i==0)
            {
                while(m%i==0)
                {
                    num[ans]++;m/=i;
                }
                ans++;
            }
        }
        if(m!=1)
            num[ans++]=1;
        for(sum=1,i=0;i<ans;i++)
            sum*=6*num[i];
        printf("%d\n",sum);
    }
    return 0;
}

抱歉!评论已关闭.