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)

具体的GCD和LCM手写法可以看这篇文章

若出现错误,欢迎指出。

祝大家在学习的道路上能取得大的进步!

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优化)的主要内容,如果未能解决你的问题,请参考以下文章

[NOIp 2009]Hankson的趣味题

Noip2009 Hankson的趣味题

NOIp2009 Hankson 的趣味题

NOIP2009 T2 Hankson的趣味题

NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

Luogu P1072 NOIP2009 Hankson的趣味题暴力