最小公倍数与最大公约数问题(NOIP竞赛原题)
来源:互联网 发布:爱淘宝应用访问的api 编辑:程序博客网 时间:2024/05/17 09:07
最小公倍数与最大公约数问题:
描述 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 ;
}
描述 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 ;
}
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- 采药问题(NOIP竞赛原题)
- 最大公约数与最小公倍数问题
- 装箱问题(NOIP竞赛原题)(动态规划)
- 装箱问题(NOIP竞赛原题)(动态规划)
- [noip2001p2]最大公约数与最小公倍数问题
- 求先序序列(NOIP竞赛原题)
- 求先序序列(NOIP竞赛原题)
- codevs 1012 NOIP 2001 最大公约数和最小公倍数问题
- NOIP 2001普及组 最小公倍数和最大公约数问题 详解
- Vijos 1131题:最小公倍数和最大公约数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 最大公约数和最小公倍数问题
- 控制文件和启动参数文件的备份
- 猴子分桃问题
- 装箱问题(NOIP竞赛原题)(动态规划)
- 求先序序列(NOIP竞赛原题)
- SQL查询所有存储过程(sp)中的内容和参数(parameter)
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- 在Hibernate中处理批量更新和批量删除
- 求质因子个数的方法
- html javascript入门——针对有基础的人士
- [转]四大开源商业智能平台大比拼[http://database.ctocio.com.cn/analysis/289/7610289.shtml]
- 传递: xml string到sql server时的sp_xml_preparedocument无法解析问题
- 踏雪有痕-数组
- C++的iostream标准库介绍
- 最近在做WMLScirpt解释器