最小公倍数与最大公约数问题(NOIP竞赛原题)
来源:互联网 发布:mac 我的所有文件 编辑:程序博客网 时间:2024/05/16 07:52
/*
最小公倍数与最大公约数问题:
描述 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 ;
}
最小公倍数与最大公约数问题:
描述 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 ;
}
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- 采药问题(NOIP竞赛原题)
- 最大公约数与最小公倍数问题
- 装箱问题(NOIP竞赛原题)(动态规划)
- 装箱问题(NOIP竞赛原题)(动态规划)
- [noip2001p2]最大公约数与最小公倍数问题
- 求先序序列(NOIP竞赛原题)
- 求先序序列(NOIP竞赛原题)
- codevs 1012 NOIP 2001 最大公约数和最小公倍数问题
- NOIP 2001普及组 最小公倍数和最大公约数问题 详解
- Vijos 1131题:最小公倍数和最大公约数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- (vc)模仿skin++皮肤
- Enterprise JavaBeans组件慨述(1)
- Enterprise JavaBeans组件慨述(2)
- java中返回局部对象问题
- 自动下载远程图片,并且自动命名asp自动下载函数
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- Enterprise JavaBeans组件慨述(3)
- Enterprise JavaBeans组件慨述(4)
- Struts+Spring+Hibernate
- 拖动类(重写版)
- jsp技巧收集200多个
- Enterprise JavaBeans组件慨述(5)
- Enterprise JavaBeans组件慨述(6)
- Enterprise JavaBeans组件慨述(7)