• 最大公约数和最小公倍数问题


    1012 最大公约数和最小公倍数问题

    2001年NOIP全国联赛普及组

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 白银 Silver
     
    题目描述 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

    暴力求解法:

    #include<iostream>
    using namespace std;
    int Isaccord(int x, int y, int P, int Q)
    {
    	for(int i = x + 1; i <= P; i++)
    	{//检测是否存在比x更大的公因数 
    		if(P % i == 0 && Q % i == 0)
    			return 0;
    	}
    	for(int i = Q; i <= y - 1; i++)
    	{//检测是否存在比y更小的公倍数 
    		if(i % P == 0 && i % Q == 0)
    		   return 0;
    	}
    	return 1;
    }
    int main()
    {
    	int x, y;
    	while(cin >> x >> y)
    	{
    		int num = 0;
    		int P, Q;
    		for(P = x; P <= y; P++)
    		{
    			if(P % x == 0 && y % P == 0)//P是x的倍数,y是P的倍数 
    			{
    				for(Q = P; Q <= y; Q++)
    			    {
    				    if(Q % x == 0 && y % Q == 0)
    				    {//x是P、Q的公因数,y是P、Q的公倍数 
    					   if(Isaccord(x, y, P, Q))//判断是否是最大公因数,最小公倍数 
    				        {
    				        	if(P == Q)
    				        	  num ++;
    				        	else
    				        	  num += 2;//P、Q可以交换值作为另一组新的值 
    						}
    				    }
    			   }
    			}
    		}
    		cout << num << endl;
    	}
    } 
    

      数论初步求解算法

    #include<iostream>
    using namespace std;
    int main()
    {
        int x, y;
        while(cin >> x >> y)
        {
            int num = 1;//记录不同质因数的个数再包括1,因此初始化为1 
            if(y % x != 0)//y应当是x的倍数,否则不存在符合条件的P、Q 
                cout << 0 << endl;
            else
            {
                int k = y / x;//为简化问题,将所有的数都除以x 
                int k1 = k;
                int i = 2;
                while(i <= k)
                {//当所有的数都除以x后,找出k的所有质因子的 
                    if(k1 % i == 0)
                        num++;//计算不同的质因子的个数 
                    while(k1 % i == 0)
                        k1 = k1 / i;
                    i++;
                }
                /*比如说当k=60时,质因子为 2 , 2, 3, 5再额外加上因子1,(因为P可以等于1*x,
                此时Q=k*x),将1,2,2,3,5分成两部份,各部分的乘积分别为P,Q,2和2必定要放在一组 
                (为满足最小公倍数和最大公因数的条件),因此不同的组合是(num - 1)*2 */ 
                cout << (num - 1) * 2 << endl;
            }
        }
    }
  • 相关阅读:
    会跳舞的树(只用HTML+CSS)(转)
    国内UED收录
    HDU 1078 dfs+dp
    HDU 1278
    HDU 4499
    HDU 4597
    POJ2777
    POJ1780 Code
    简单的Fleury算法模板
    POJ 2513 无向欧拉通路+字典树+并查集
  • 原文地址:https://www.cnblogs.com/denghui666/p/7784382.html
Copyright © 2020-2023  润新知