博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1029 最大公约数和最小公倍数问题 数论
阅读量:5936 次
发布时间:2019-06-19

本文共 1661 字,大约阅读时间需要 5 分钟。

洛谷P1029 最大公约数和最小公倍数问题

题意 给定 x0与y0 求有多少组正整数对(P,Q) 满足 P与Q的最大公约数是x0 最小公倍数是y0

首先我们可以发现x0*y0 == P*Q
那么我们知道 x0 与 y0 的乘积 我们就可以在 O(sqrt(n)) 的时间内枚举他的因数
然后再判断 其公约数是否为 x0 设 w=sqrt(x0*y0) 时间复杂度则为 O(w*log(w))

 

#include 
#include
#define ll long long using namespace std ;ll xx,yy,x,y,sum,r ;int ans ; ll gcd(ll x,ll y) { if(!y) return x ; return gcd(y,x%y) ; }int main() { scanf("%lld%lld",&xx,&yy) ; sum = xx*yy ; r = sqrt(sum) ; for(ll x=xx;x<=r;x++) { if(sum%x!=0) continue ; y = sum/x ; if(xx==gcd(x,y)) { if(x==y) ans++; else ans+=2 ; printf("%lld %lld\n",x,y) ; } } printf("%d\n",ans) ; return 0 ;}

 

# include 
# include
int main(){ int x0,y0,h,ratio,factor=0; scanf("%i%i",&x0,&y0); //输入给定的最大公约数x0和最小公倍数y0 if(y0%x0) //如果y0不是x0的倍数 return !puts("0"); //则不存在满足给定最大公约数和最小公倍数的数 for(ratio=y0/x0,h=2;ratio>1;h++) //y0与x0的比值为ratio { //将ratio分解质因数 factor+=!(ratio%h); //可以分解出的质因数的种数为factor while(!(ratio%h)) ratio/=h; //保证分解出的因数h是质数 } return !printf("%.0f\n",pow(2,factor)); //输出满足给定要求的数的对数pow(2,factor)}

另外还有一种神奇的做法是我从题解中看到的,不过比较难理解
因为我们发现 每多一种方案,其实就是把 x扩大k倍 y缩小k倍 然后这个k值是从 y0/x0 中取的,因为
显然不能扩太大,使x超过两数最小公倍数y0了, 但这个扩大也不是无规律的,x扩大了k倍 ,y缩小后因子就不能有 k
否则就不能维持相对平衡了, 那就是说相同的因子要站在同一边,这样每类因子有两种站边选择,这样所有的方案数就是2^factor

转载于:https://www.cnblogs.com/third2333/p/6816966.html

你可能感兴趣的文章
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
apache prefork模式优化错误
查看>>
jmeter高级用法例子,如何扩展自定义函数
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
JS页面刷新保持数据不丢失
查看>>
清橙A1202&Bzoj2201:彩色圆环
查看>>
使用data pump工具的准备
查看>>
springMVC---级联属性
查看>>
get和post区别
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
cmd.exe启动参数说明
查看>>
《随笔记录》20170310
查看>>