蓝桥杯-寻找整数

"""
题目来源:
https://www.lanqiao.cn/problems/2131/learning/?page=1&first_category_id=1&name=%E5%AF%BB%E6%89%BE%E6%95%B4%E6%95%B0
建议先看一下中国剩余定理: https://blog.csdn.net/weixin_60193316/article/details/137074042
"""
# ps[i]表示n模i下的余数
ps = {
    2:1,
    3:2,
    5:4,
    7:4,
    11:0,
    13:10,
    17:0,
    19:18,
    23:15,
    29:16,
    31:27,
    37:22,
    41:1,
    43:11,
    47:5
    }

# 先求ax + by = gcd(a, b)的一组解
# 返回gcd(a, b), x, y
def exgcd(a, b):
  # 递归出口
  if b == 0:
    return a, 1, 0
  g, x2, y2 = exgcd(b, a % b)
  x1, y1 = y2, x2 - (a // b) * y2
  return g, x1, y1
# 再求ax + by = m的一组解(当m=1是就是求a在模b意义下的逆元x)
def Func(a, b, m):
  g, x1, y1 = exgcd(a, b)
  x0, y0 = x1 * m // g, y1 * m // g
  return x0 % b

# 除数的乘积
N = 1
for k in ps: 
  N *= k

sumXiBi = 0
for mi, bi in ps.items():
    # 求n个由原同余方程组变化得来的新同余方程组的解xi
    Mi = N // mi
    # 求Mi模mi意义下的逆元
    t = Func(Mi, mi, 1)
    xi = Mi * t
    sumXiBi += xi * bi

print(sumXiBi % N)
"""
官方题解: 暴力求解
"""
from math import gcd

#求数字a,b的最小公倍数
def lcm(a, b):
    return a * b // gcd(a, b)

a=[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]
x = 0
step = 1
for i in range(2, 50):
    #暴力求解满足x % i = a[i]
    while x % i != a[i]:
        x += step
    step = lcm(step, i)
print(x)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好无聊啊,烦死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值