hdu 4497 GCD and LCM 数论 素数分解

GCD and LCM

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)

Total Submission(s): 1339    Accepted Submission(s): 607

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

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497

题意:每个案例给你两个数G和L。然后找有多少不同的(x,y,z) 的gcd是G,且lcm是L。

做法:分解素数G,L。

首先 L%G!=0 那肯定是输出0的。

第一个案例  6 72

分解后 6 有一个2,一个3。

72分解后有3个2,2个3。

然后对于素数2, 6的1个2 是下限,72的3个2是上限。   x,y,z 必须有一个数 能分解出一个素数2,必须有另一个数 分解出3个2, 然后剩下的那个数分解出的2的个数必须在【1,3】之间。

然后可以推出 对于素数2  给x,y,z分配素数2 的个数 一共有 6+(3-1 -1)*6 种分法。前面一个6,代表第三个数是和上限或者下限相等的 如 2 2 8 或者 2 8 8 。因为有两个数相等所以他们的排列组合是3种。  所以是2*3=6种。   然后后面的是代表 三个数都不相同的情况,3-1-1 =1说明1至3之间只有一个数,也就是2,也就是分配两个素数2。   然后 2 4 8排列组合,三个都不同,排列组合为6。

所以对于素数2 的分配方法一共有 12种。

然后分配3,一共有6种。

把各个素数的 分配方法数相乘   12*6=72。 就是总的方案数了。

显然对于这题,可以只用分解L/G,然后对于L各个素数的下限全是0。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map>
#define ll __int64

__int64 gcd(__int64 a,__int64 b)
{

	if(b==0) return a;
	return gcd(b,a%b);
}
__int64 lcm(__int64 a,__int64 b)
{
	return a/gcd(a,b)*b;
}

#define N 10000000
//prime[0,primenum)
ll prime[1000000], primenum;
bool Isprime[N+10];
//<=Max_Prime的素数
void PRIME(ll Max_Prime){
    primenum = 0;
   Isprime[0] = Isprime[1] = 0;
    Isprime[2] = 1;
    prime[primenum++] = 2;
    for(ll i = 3; i <= Max_Prime; i++)
        Isprime[i] = i&1;
    for (ll i = 3; i <= Max_Prime; i+=2){
        if(Isprime[i])
            prime[primenum++] = i;
        for (ll j = 0; j < primenum; j++){
            if(prime[j] * i > Max_Prime)break;
            Isprime[prime[j]*i] = 0;
            if(i%prime[j] == 0)break;
        }
    }
}  

ll fen_g[1000000];
ll fen_l[1000000];
ll vis[1000000];
ll wei[1000000];
int main()
{
	PRIME(100000);
	__int64 t,g,l;
	scanf("%I64d",&t);
	while(t--)
	{
		scanf("%I64d%I64d",&g,&l);
		if(l%g!=0)
			printf("0\n");
		else
		{
			memset(fen_g,0,sizeof fen_g);
			memset(fen_l,0,sizeof fen_l);
			memset(vis,0,sizeof vis);
			l=l/g;
			__int64 tem_g=g;
			__int64 tem_l=l;
			__int64 ji=0;

			for(__int64 i=0;i<primenum;i++)
			{
				while(tem_l%prime[i]==0)
				{
					tem_l/=prime[i];
					if(fen_l[i]==0&&vis[i]==0)
					{
						vis[i]=1;
						wei[ji++]=i;
					}
					fen_l[i]++;//上限
				}
			}

			if(tem_l!=1)
			{
				wei[ji++]=primenum;
				vis[primenum]=1;
				fen_l[primenum]++;
			} 

			ll ans=1;
			for(__int64 i=0;i<ji;i++)
			{
				__int64 ww=wei[i];
				__int64 cnt=fen_l[wei[i]];
				if(cnt==1)
				{
					ans*=6;
				}
				else
					ans*=3*2+(cnt-1)*6;
			}
			printf("%I64d\n",ans);

		}
	}
	return 0;
} 
时间: 2024-10-03 13:46:47

hdu 4497 GCD and LCM 数论 素数分解的相关文章

HDU4497 GCD and LCM 数论 素数分解

题意很简单首先以前做最简单的LCM跟CGD的时候都知道先求出两个数A,B的最大公约数GCD,那么LCM可以利用  A*B/GCD来求得,这点一开始脑残了没想到,结果没有进行特盘所以错了,意思就是 题目给的L%G不为0的话就是无解,结果我给判其它的去了,肯定漏了些什么没有发现 然后对于 L/G进行素因子分解,同时任意的数都能够通过素因子分解来表示,所以三个解x,y,z也能分解 L/G = p1^q1*p2^q2.... x = p1^i1*... y = p1^j1*... z = p1^k1*.

hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理

//昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中没有的质因子 2,存在bi>bi',然后剩下的都是可行解,对于每一个质因子三个数中有两个分别bi,bi',第三个的取值可为[bi,bi'],所以对于每一个质因子共有6(bi-bi')种取法(A(2,3)*(b-a+1)+C(2,3)*2分别为取得值在和不在边界上的情况,特殊:如果bi=bi'就只有一

hdu 4497 GCD and LCM(排列组合)

题目:hdu 4497 GCD and LCM 题目大意:给出三个数的最大公约数,和最小公倍数,问这三个数的排列组合关系. 解题思路:最小公倍数/最大公约数 ==  三个数不同部分的乘积.这样来考虑的话,三个数都要有最大公约数的部分,其余的部分就是由LCM / GCD 里面的因子构成.这里面的因子可能会有 2 2 3 这样的情况, 不同的因子之间是不会相互干扰的,但是相同的会出现问题,因为,不能同时将相同的因子都放在三个位置上,这样最大公约数就的要乘上这个因子.然后对于单种因子来考虑的话,每种因

hdu 4497 GCD and LCM 数学

GCD and LCM Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4497 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

hdu 4497 GCD and LCM

GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 1092    Accepted Submission(s): 512 Problem Description Given two positive integers G and L, could you tell me how many solutions of (

hdu 4497 GCD and LCM(唯一分解+容斥原理)

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)

HDU 4497 GCD and LCM(分解质因子+排列组合)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满足要求的(x, y, z)有多少组,并且要考虑顺序. 思路:如果L%G != 0显然不存在这样的(x, y, z),相反肯定存在.具体做法就是将L/G分解质因子,得到:L/G = P1^t1 * P2^t2 * ... * Pk^tk,我们来考虑任意一个因子Pi^ti,此时(x/G, y/G, z/

HDU 4497 GCD and LCM (分解质因数)

链接 : ?? http://acm.hdu.edu.cn/showproblem.php?pid=4497 假设G不是L的约数 就不可能找到三个数. L的全部素因子一定包括G的全部素因子 而且次方数一定大于等于G的.仅仅须要三个数 对于每个素因子的次方数 三个的最小值是G的,最大值是L的.考虑三个相应的次方数都不一样.那么当中两个是确定的 一个是G的一个是L的 剩下的一个在G和L的之间. 算上排列 总共同拥有6种.或者当中两个是一样的,那么也有6种情况. 最后能够合并计算. //#pragma

Hdu 4497 GCD and LCM(数论)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4497 思路:x%G==0,y%G==0,z%G==0,所以L%G==0,若L%G!=0则一定无解. 考虑 L/G=(p1^t1)*(p2^t2)*......*(pn^tn) x'=x/G=(p1^a1)*(p2^a2)*......*(pn^an) y'=y/G=(p1^b1)*(p2^b2)*......*(pn^bn) z'=z/G=(p1^c1)*(p2^c2)*.......*(pn^cn