zl程序教程

您现在的位置是:首页 >  其它

当前栏目

HDU - 4497 GCD and LCM

and HDU gcd
2023-09-14 09:07:56 时间

题意:给出三个数的gcd,lcm,求这三个数的全部的可能

思路 :设x,y,z的gcd为d,那么设x=d*a,y=d*b,z=d*c。a,b。c肯定是互质的。那么lcm=d*a*b*c,所以我们能够得到a*b*c=lcm/gcd=ans,将ans分解因数后,那么每次都要分配每一个因数的个数,如果某个因数的个数为n,一定要有两个分配到n,0,所以是6种

#include <iostream>
#include <cstdio>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int n,m;
int num[1000000];

int main(){
	int t;
	scanf("%d",&t);
	while (t--){
		scanf("%d%d",&n, &m);
		if (m%n != 0){
			printf("0\n");
			continue;
		}
		m /= n;
		int cnt = sqrt(m+0.5);
		int k = 0;
		for (int i = 2; i <= cnt && m > 1; i++){
			if (m % i == 0){
				num[k] = 0;
				while (m%i == 0){
					++num[k];
					m /= i;
				}
				++k;
			}
		}
		if (m != 1)
			num[k++] = 1;
		int ans = 1;
		for (int i = 0; i < k; i++)
			ans = ans*num[i]*6;
		cout << ans << endl;
	}
	return 0;
}