第十三届蓝桥杯省赛 B. 寻找整数

摘要
Title: 第十三届蓝桥杯省赛 B. 寻找整数
Tag: 最小公倍数、数论、中国剩余定理
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

B. 寻找整数

  • 题意

    找一个不超过 10的17次方 的正整数 n,这个n是除以 2 至 49 后的余数已经是给定了的,求这个正整数最小是多少?

  • 思路

    之前写过一个中国剩余定理的解法,Link,下面给出一个更通俗易懂的解法

    给出结论x%m1=a1,x%m2=a2x \% m1 = a1, x \% m2 = a2,那么下一个满足这个条件的数为x+lcm(m1,m2)x + lcm(m1, m2)(该结论可以推广为nn项)

    那么对于这个题

    • 当模数m1m1满足条件时,就更新一下LCM=lcm(LCM,m1)LCM = lcm(LCM, m1)
    • 当模数m1m1不满足条件时,就让xx一直加到满足条件为止

    ps: 只适用于有解的情况

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    '''
    Author: NEFU AB-IN
    Date: 2022-04-09 10:04:11
    FilePath: \Contest\tempCodeRunnerFile.py
    LastEditTime: 2022-04-12 11:26:23
    '''
    def gcd(a, b):
    return gcd(b, a % b) if b else a


    d = [
    0, 0, 1, 2, 1, 4, 5, 4, 1, 2, 9, 0, 5, 10, 11, 14, 9, 0, 11, 18, 9, 11, 11,
    15, 17, 9, 23, 20, 25, 16, 29, 27, 25, 11, 17, 4, 29, 22, 37, 23, 9, 1, 11,
    11, 33, 29, 15, 5, 41, 46
    ]

    # ans为结果,id为模数,lcm初值为2(即一开始的模数为2)

    id = 2
    while id <= 49:
    if id == 2:
    lcm, ans = id, d[id]
    if ans % id == d[id]:
    lcm = lcm // gcd(lcm, id) * id
    id += 1
    else:
    ans += lcm

    print(ans)
使用搜索:谷歌必应百度