(数论)最大公约数和最小公倍数问题

 

题目描述 Description

输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数

条件:  1.P,Q是正整数

2.要求P,Q以x0为最大公约数,以y0为最小公倍数.

试求:满足条件的所有可能的两个正整数的个数.

输入描述 Input Description

二个正整数x0,y0

输出描述 Output Description

满足条件的所有可能的两个正整数的个数

样例输入 Sample Input

3 60

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

3 60

60 3

12 15

15 12

分析
    1. 我们知道:Q=P*y0/x0,令y0/x0=k,则可得到一个等式:Q=k*P。则我们的目的就是找出这个等式成立共有多少种可能;
    2. 为了使等式两边成立,只需把k分解因数,把因数分到等式两边即可,如对于输入样例可得:k=20,可分解成:2*2*5,由于要保证最大公因数不会改变,所以2*2只能当做是一个4放在等式的一边,而不能把两个2分别放在等式两边,否则最大公因数将会变成2*3=6;
    3. 所以,k=20时,只能分解成4*5,也就是20只有两种质因数——2和5,所以2个因数要分到等式两边的情况共有4种,所以答案是4(如表2)。
    4. 所以,此题我们只需把k(y0/x0)进行分解质因数,如果质因数共有n种,则答案就是2的n次方。

 1 #include<stdio.h>
 2 #include<math.h>
 3 int x,y;
 4 bool zhi(int x)
 5 {
 6      for (int i=2;i<=sqrt(x);++i)
 7          if (x%i==0) return 0;
 8      return 1;
 9 }
10 int main()
11 {
12     scanf("%d%d",&x,&y);
13     if (y%x!=0)
14     {
15                printf("0/n");
16                return 0;
17     }
18     x=y/x; y=0;
19     for (int i=2;i<=x;++i)
20         if (zhi(i))
21         { 
22                    if (x%i==0) ++y;
23                    while (x%i==0) x/=i;
24         }
25     printf("%d/n",(int)pow(2,y));
26     return 0;
27 }
View Code

 

posted @ 2014-12-15 23:11  CodeNoob  阅读(676)  评论(0编辑  收藏  举报