厕所杯寻找整数,扩展中国剩余,python

文章讨论了一道编程题,该题要求根据给定的除以2至49的余数,使用扩展中国剩余定理找到最小正整数解。作者遇到了Python中类型转换和除法运算的问题,并提供了代码示例来解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

 

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

有一个不超过 10e17 的正整数 n,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

 扩展中国剩余的板子题,一是自己没用过python写exgcd,也不是很明确python在除法过程中的隐藏的类型转换,最重要的是一个模数写错了,导致一直不对(sb厕所杯!)。

上代码:

p,q=0,0
def exgcd(a,b):
    global p,q
    if (b==0):
        p,q=1,0
        return a
    gcd=exgcd(b,a%b)
    mid=p
    p=q
    q=mid-a//b*p
    return gcd

m=[i for i in range(2,50)]
r=[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]

m1,r1=m[0],r[0]
for i in range(1,48):
    m2,r2=m[i],r[i]
    gcd=exgcd(m1,m2)
    if ((r2-r1)%gcd!=0):
        print(1)
        continue
    p=p*(r2-r1)//gcd
    p=((p%(m2//gcd)+(m2//gcd))%(m2//gcd))
    r1=r1+m1*p
    m1=m1*m2//gcd
print(((r1%m1)+m1)%m1)

通过情况:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值