博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】 P1072 Hankson 的趣味题
阅读量:5265 次
发布时间:2019-06-14

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

\(Description:\)

给定\(a_0,a_1,b_0,b_1\),求所有满足\(gcd(x,a_0)=a_1\),\(lcm(x,b_0)=b_1\)的x的个数。

\(Sample\) \(Input\):

2

41 1 96 288
95 1 37 1776

\(Sample\) \(Output\):

6

2

数论题都那么毒瘤吗?

一开始除了暴力毫无思路。。。

暴力:从\(a_1->b_1\)枚举。。。。。。

没有思路,化个式子放松放松:

\(a_0=a_1*k_1\)

\(x=a_1*k_2\)

\(b_1=b_0*k_3\)

\(b_1=x*k_4\)

震惊!发现x是\(a_1\)的倍数,是\(b_1\)的因数。

于是想着随便枚举\(b_1\)的因数,gcd,lcm判断。

喵的过了。。。。。。

要不要看代码呀?

#include
#define int long longusing namespace std;int T,ans;int a0,b0,a1,b1;inline int gcd(int a,int b){ int tmp=0; while(b){ if(a

然而题解里还有一种更强的做法:

首先一个推论:

对于\(gcd(a,b)=c\),\(gcd(a/c,b/c)=1\)

证明:

\(a=c*k_1\),\(b=c*k_2\)

那么如果推论不成立,那么一定有\(k_1*k_2\)里还有a,b公因数。

那么可以继续拆分

那么原式变为:

\(gcd(x,a_0)=a_1\) \(=>\) \(gcd(x/a_1,a_0/a_1)=1\)

\(lcm(x,b_0)=b1\) \(=>\) \(gcd(b_1/b_0,b_1/x)=1\)

这样枚举范围小一点,照理说会快,然而我却慢了。

#include
#define int long longusing namespace std;int T,ans;int a0,b0,a1,b1;inline int gcd(int a,int b){ int tmp=0; while(b){ if(a

转载于:https://www.cnblogs.com/JCNL666/p/10641259.html

你可能感兴趣的文章
转:ArcGIS10.1正式版安装与破解
查看>>
国内代码托管
查看>>
sql进阶-筛选库表中数据为空的表
查看>>
ife task0003学习笔记(二):JavaScript原型
查看>>
SQL循环遍历,删除表里某一列是重复的数据,只保留一条。
查看>>
JAVA安装及环境变量配置
查看>>
WCF 第八章 安全 消息层安全
查看>>
WCF 第八章 安全 确定替代身份(下)-模仿用户
查看>>
ecshop 的transport.js 与jqueyr冲突
查看>>
css渲染(三)颜色与背景
查看>>
[ios] UIWebView的离线缓存【转】
查看>>
如何写复杂的SQL
查看>>
HNOI2002 营业额统计
查看>>
UE4之数组
查看>>
超分辨率的国内外研究现状
查看>>
PPP 转义字符 编码 和 解码
查看>>
ios开发UI篇—Kvc简单介绍
查看>>
finereport的count函数实现两列比较后进行累加
查看>>
Centos查看端口占用情况
查看>>
oracle 中的日期函数
查看>>