首页 > 其他分享 >蓝桥杯 寻找整数

蓝桥杯 寻找整数

时间:2023-12-13 20:57:07浏览次数:34  
标签:11 frac gcd 寻找 整数 蓝桥 m1 m2 r1

题目
扩展中国剩余定理,将所有同余方程合并为一个
设有 \(x \equiv r_1(mod\ m_1)\),\(x \equiv r_2(mod\ m_2)\),即 \(x=m_1p+r_1=m_2q+r2\)

则有 \(m_1p-m_2q=r_2-r_1\),

由扩展欧几里得算法,得:

方程 \(m_1p-m_2q=gcd(m_1,m_2)\) 特解 \(p',q'\)

对于原方程:

当 \((r2-r1)\%gcd(m_1,m_2)\neq0\) 时,无解。

特解: \(p^*=p'\times\frac{r_2-r_1}{gcd(m1,m2)}\),\(q^*=q'\times\frac{r_2-r_1}{gcd(m_1,m_2)}\)

通解:

\[\left\{ \begin{aligned} &P=p^*+k\frac{m_2}{gcd(m_1,m_2)}\\ &Q=q^*-k\frac{m_1}{gcd(m_1,m_2)} \end{aligned} \right. \quad\quad\quad k\in Z \]

把通解 \(P\) 代入 \(x=m_1p+r1\) 中,得:

\[x=\frac{m_1m_2}{gcd(m_1,m_2)}k+m_1p'\frac{r_2-r_1}{gcd(m_1,m_2)}+r_1 \]

这样就将 \(2\) 个同余方程合成了一个了,这个式子同样可以继续和同余方程合并。

最终将所有同余方程合并为 \(1\) 个之后,取 \(x\) 得最小正整数解就行。

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

def exgcd(a, b):
    if b == 0: return a, 1, 0
    d, x, y = exgcd(b, a % b)
    x, y = y, x - a // b * y
    return d, x, y

def main():
    m1, r1 = m[0], a[0]
    for i in range(1, len(a)):
        m2, r2 = m[i], a[i]
        d, p, q = exgcd(m1, m2)
        if (r2 - r1) % d != 0: print(-1);return
        p *= (r2 - r1) // d
        p = (p % (m2 // d) + m2 // d) % (m2 // d) #保证p为正数
        r1 += m1 * p
        m1 *= m2 // d
    print(m1, r1)


if __name__ == '__main__':
    main()

标签:11,frac,gcd,寻找,整数,蓝桥,m1,m2,r1
From: https://www.cnblogs.com/BakaCirno/p/17899853.html

相关文章

  • 2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a
    2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,首先将字母a到z编号为0到25编号,纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号,若i>1的话就表示第i个字母和第i-1个字母编号的差值,例如,a2就代表密码中第1个字母和第2个字母编号的差值,若密码是acb,那么纸......
  • 2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a
    2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,首先将字母a到z编号为0到25编号,纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号,若i>1的话就表示第i个字母和第i-1个字母编号的差值,例如,a2就代表密码中第1个字母和第2个字母编号的差值,若密码是acb,......
  • 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否
    问题描述:给40亿个不重复的unsignedint的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?问题分析:40亿不重复,没有排序。40亿个unsignedint的整数,放到内存中的话,大约是160G。32*40亿=1280亿=1280000000000bit=160000000000~160g8bit(比特位)=1Byte(字节)......
  • 第八届蓝桥杯赛题 分巧克力(用二分法实现)
    今日一道编程题  第八届蓝桥杯赛题中的分巧克力问题(用二分法实现)问题描述如下:儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是HixWi的方格组成的长方形。为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给......
  • P8805 [蓝桥杯 2022 国 B] 机房
    原题链接前情提要题目不难看懂,即求a->b过程中的所有点的延迟和。显然可以暴力遍历一遍完成,但是时间复杂度太高了。改进算法想象这个图是由点和线组成的,把其中一个点提起来,这样就变成了一个树(n叉树),任意两点(a,b)间的延迟和等于a->lca->b,其中lca为ab两点的最近公共祖先这样一来,只......
  • #yyds干货盘点# LeetCode程序员面试金典:两整数之和
    题目给你两个整数a和b,不使用运算符+和-,计算并返回两整数之和。 示例1:输入:a=1,b=2输出:3示例2:输入:a=2,b=3输出:5代码实现classSolution{publicintgetSum(inta,intb){while(b!=0){intcarry=(a&b)<<1;......
  • 算法:如何实现大整数相加?
    算法题:给你两个很大很大的整数(如100位整数),如何求出它们的和?思路:小学数学竖式拆分,各个击破。在程序中列出的“竖式”究竟是什么样子呢?我们以426709752318+ 95481253129为例,来看看大整数相加的详细步骤:第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下......
  • 视频展播神器,批量添加、快速修改视频,自动循环播放,无损画质!如果你也在寻找一款能够快速
        做展播视频的朋友们,你是否也在为快速修改视频发愁?小小的改动都需要繁琐的剪辑来解决,轮播结束要守着立刻重来一次,耗时耗力,小小的工作,大大的烦恼!来看看这款专为企业展播和针对不露脸无人直播设计的全新工具——《小星星去重播放器》!    《小星星去重播放器》是一......
  • 2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小
    2023-12-09:用go语言,给你两个整数数组arr1和arr2,返回使arr1严格递增所需要的最小「操作」数(可能为0)。每一步「操作」中,你可以分别从arr1和arr2中各选出一个索引,分别为i和j,0<=i<arr1.length和0<=j<arr2.length,然后进行赋值运算arr1[i]=arr2[j]。如果......
  • 12.9 蓝桥杯 huffuman树c语言
    今天学习了蓝桥杯的huffuman树,总结如下:问题描述Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。给出一列数{pi}={p0,p1,…,pn-1},用这列数构造Huffman树的过程如下:1.找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加......