【题解】洛谷P1072 Hankson的趣味题 (gcd和lcm的应用)
2024-08-28 19:49:03
洛谷P1072:https://www.luogu.org/problemnew/show/P1072
思路
gcd(x,a0)=a1
lcm(x,b0)=b1→b0*x=b1*gcd(x,b0) (由a*b=gcd(a,b)*lcm(a,b))
x=(b1/b0)*gcd(x,b0)
令i=gcd(x,b0)∈[1,√b0] 分成两半求减少时间复杂度 特判相等的时候
判断x=(b1/b0)*i和x=(b1/b0)*(b0/i)是否满足条件
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,a0,a1,b0,b1,ans;
int gcd(int a,int b)
{
if(b==) return a;
else
return gcd(b,a%b);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
ans=;
if(b1%b0!=)//不是整数
{
cout<<<<endl;
continue;
}
for(int j=;j*j<b0;j++)//枚举j=gcd(x,b0) 枚举一半即可
{
if(b0%j==)
{
int x=b1/b0*j;//公约数为j
if(gcd(x,b0)==j&&gcd(x,a0)==a1)
ans++;
x=b1/b0*(b0/j);//公约数为b0/j
if(gcd(x,b0)==b0/j&&gcd(x,a0)==a1)
ans++;
}
}
int k=int(sqrt(b0));//特殊情况 两者相等
if(k*k==b0)
{
int x=b1/b0*k;
if(gcd(x,b0)==k&&gcd(x,a0)==a1)
ans++;
}
cout<<ans<<endl;
}
}
最新文章
- 常用备份工具是mysql自带的mysqldump
- Html中代码换行造成空格间距的问题
- php json_decode 函数
- Node.js -- Router模块中有一个param方法
- 跟随标准与Webkit源码探究DOM -- 获取元素之querySelector,querySelectorAll
- 移动统计工具Flurry
- Codeforces Round #329 (Div. 2)
- 最简puremvc
- 2764: [JLOI2011]基因补全
- AngularJs学习笔记3-服务及过滤器
- find命令总结
- CSS布局之--各种居中
- 【zabbix教程系列】五、邮件报警设置(脚本方式)
- 图集内子图压缩及 ETC2 fallback选项的作用
- iis7 部署 mvc4项目提示404错误
- SQLSetConnectAttr
- 集合,ArrayList
- Express入门介绍vs实例讲解
- haproxy代理https配置方法【转】
- 手脱EXE32Pack v1.39