2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)
Posted 九院不知名高手-猫吃耗子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)相关的知识,希望对你有一定的参考价值。
2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)
本题的编码是用Python实现的,C++的思路也是相同的。
希望本文能够帮助到你!
题目:
暴力法:
直接根据题目的要求写:
from math import gcd
def lcm(a, b):
return a*b//gcd(a, b)
n = int(input())
for _ in range(n):
cnt = 0
a0, a1, b0, b1 = map(int, input().split())
for x in range(1, b1 + 1):
# 如果b1不能被x整除,x肯定不满足要求。
if b1 % x != 0: continue
if gcd(x, a0) == a1 and lcm(x, b0) == b1:
cnt += 1
print(cnt)
代码中有个小细节:
# 如果b1不能被x整除,x肯定不满足要求。
if b1 % x != 0: continue
这样可以减少一些不必要的计算。
根据题意,时间复杂度大概是O(n**2),具体一点数据量会达到百亿级别❗️
而python本来就比较慢,暴力写法必定会跑不出来,必须要进行优化才行。
优化:
由题意知:x和b0的最大公倍数是b1,我们假设一个y,x * y == b1,y可能是答案。优化如下:
from math import gcd
def lcm(a, b):
return a*b//gcd(a, b)
n = int(input())
for _ in range(n):
cnt = 0
a0, a1, b0, b1 = map(int, input().split())
# 1 <= x <= sqrt(b1) <= y <= b1
# x, y 可以取到1到b1的所有值。
for x in range(1, int(b1**0.5)+1):
if b1 % x != 0: continue
y = b1 // x
if gcd(x, a0) == a1 and lcm(x, b0) == b1:
cnt += 1
# 如果该数已经被判断过则跳过。
if x == y: continue
if gcd(y, a0) == a1 and lcm(y, b0) == b1:
cnt += 1
print(cnt)
若出现错误,欢迎指出。
祝大家在学习的道路上能取得大的进步!
NOIP真题汇总
想想在NOIP前总得做做真题吧,于是长达一个月的刷题开始了
涉及2008-2016年大部分题目
NOIP [2008] 4/4
1、传纸条:清真的三维DP
2、笨小猴:字符串模拟
3、火柴棒等式:打表+循环
4、双栈排序:贪心+栈
NOIP [2009] 3/4
2、Hankson的趣味题:数论,gcd相关
3、最优贸易:建图+SPFA
4、靶形数独:较难搜索+剪枝
NOIP [2010] 4/4
1、引水入城:DP+bfs(较好)
2、关押罪犯:贪心+并查集
3、机器翻译:模拟
4、乌龟棋:简单DP
NOIP [2011] 5/6
1、铺地毯:模拟
2、选择客栈:DP
3、Mayan游戏:较难搜索
4、计算系数:组合数
5、聪明的质检员:二分答案+前缀和
NOIP [2012] 4/6
1、Vigenère 密码:字符串
2、国王游戏:贪心+高精
4、同余方程:扩欧
5、借教室:二分答案+前缀和
NOIP [2013] 5/6
1、转圈游戏:快速幂
2、火柴排队:逆序对+贪心
3、货车运输:最小生成树+lca
4、积木大赛:递推或者分治
5、花匠:简单DP
NOIP [2014] 6/6
1、生活大爆炸版石头剪刀布:模拟
2、联合权值:类树形DP
3、飞扬的小鸟:类背包DP
4、无线网络发射器选址:模拟
5、寻找道路:图论,反向bfs
6、解方程:秦九韶
NOIP [2015] 6/6
1、神奇的幻方:模拟
2、信息传递:拓扑排序
3、斗地主:较难搜索
4、跳石头:二分答案
5、子串:DP
6、运输计划:二分答案+树上差分
NOIP [2016] 6/6
1、玩具谜题:模拟
2、天天爱跑步:lca+树上差分
3、换教室:floyd+概率DP
4、组合数问题:组合数
5、蚯蚓:队列
6、愤怒的小鸟:状态压缩DP
以上是关于2009年NOIP提高组真题-HanKson的趣味题(GCD&LCM优化)的主要内容,如果未能解决你的问题,请参考以下文章