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

最小公倍数与最大公约数问题(NOIP竞赛原题)

2013年08月19日 ⁄ 综合 ⁄ 共 2308字 ⁄ 字号 评论关闭
 最小公倍数与最大公约数问题:
                            
 描述 Description   
     输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
  条件:1.P、Q是正整数
      2.要求P、Q以xO为最大公约数,以yO为最小公倍数。
  试求,满足条件的所有可能的两个正整数的个数。 
/*

 最小公倍数与最大公约数问题:
                            
 描述 Description   
     输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P、Q的个数。
  条件:1.P、Q是正整数
      2.要求P、Q以xO为最大公约数,以yO为最小公倍数。
  试求,满足条件的所有可能的两个正整数的个数。 
   
   
 输入格式 Input Format  
   两个正整数  
   
   
 输出格式 Output Format  
   满足条件的所有可能的两个正整数的个数 

*/
/*
搜索法:
根据最小公倍数的定义可知:
若:x0 为 x,y 的最大公约数,y0 为x,y 的最小公倍数,
由定义得:
(x/x0)*(y/x0)*x0 = x*y/x0 = y0 ;
即:x0*y0 = x * y ;
设:i=x/x0,j=y/xo, 则: i*j = y0/x0 且: i,j互质,因此:我们只要找到所有
满足条件的:i,j即可
由于具有对称性,因此只要求: 1--sqrt(y0/x0) 范围内的结果,然如乘以2就OK了

*/
/*
NO.1
*/

#include <stdio.h>

int gcd (int a,int b)
{
    
if ( b == 0)
    
return a ;
    
else
    
return gcd(b,a%b) ;
}

int is_fu_ze(int a,int b)
{
    
if(gcd(a,b) == 1)
    
return 1 ;
    
else
    
return 0 ;
}

int main(void)
{
    
long x0,y0,i,j,k,total=0;
    
    scanf(
"%ld %ld",&x0,&y0);
    
    
if( y0 % x0 != 0 || x0 == y0)
    {
       ( x0 
== y0) ? printf("1 ") : printf("0 ");
       
return 0 ;
    }
    
    k 
= y0 / x0 ;
    j 
= (int)sqrt((double)k) ;
    
for(i=1 ; i<= j ; i++)
    
if( k % i == 0 && is_fu_ze(i,k/i) )
    {
        total 
++ ;
        printf(
"%ld %ld ",i,k/i);
    }
    
    
    printf(
"total = %ld ",total*2) ;
    
    system(
"pause");
    
return 0 ;
}
/*
NO.2  
*/ 
/*找规律法:
n = 2^k ; 其中K是YO/X0的质因子个数
*/
       #include 
<stdio.h>
       
       
int main(void)
       {
           
long x0,y0 ;
           
long   k,total=0;
           
int i,j,num=0 ;
           
           scanf(
"%d %d",&x0,&y0);
           
           
if ( y0 % x0 != 0 || y0 == x0)
           {
                
               ( x0 
== y0) ? printf("1 ") : printf("0 ");
                
return 0 ;
           }
           
           k 
= y0/x0 ;
           
           j 
= 2
           
           
while (1)
           {
                 
if(k % j == 0)
                 {
                      
                     
while(k % j == 0 && k != j)
                     k 
/= j ;
                     num 
++ ;
                     
if(k == j)
                     
break ;
                 }
                 
                 j 
++ ;
           }
           
           total 
= 1 ;
           
for(i=1 ; i<= num ; i++)
           total 
*= 2 ;
           printf(
"%ld",total);
            
           
return 0 ;
       }

 

抱歉!评论已关闭.