首页 > 其他分享 >[lnsyoj517/luoguP4777]扩展中国剩余定理

[lnsyoj517/luoguP4777]扩展中国剩余定理

时间:2024-07-27 18:18:10浏览次数:7  
标签:luoguP4777 方程 pmod 定理 int lnsyoj517 include LL equiv

题意

原题链接
求线性同余方程组

\[\begin{cases}x\equiv b_1\pmod{a_1}\\x\equiv b_2\pmod{a_2}\\\dots\\x\equiv b_n\pmod{a_n}\end{cases} \]

的最小非负整数解。

sol

[lnsyoj163/luoguP1495]曹冲养猪不同的是,本题无法保证互质,这就导致中国剩余定理无法使用,需要一种新的方式来解决问题。
我们思考:如果我们可以将两个方程合并为一个方程,那么整个方程组都可以合成为一个方程,问题也就解决。
下面进行推导:
对于两个方程 \(x\equiv b_1\pmod{a_1}\)、\(x\equiv b_2\pmod{a_2}\),,我们将其分别转换为 \(x + a_1p = b_1\) 和 \(x + a_2q = b_2\),整理得 \(a_2q-a_1p = b_2 - b_1\),利用扩展欧几里得算法,我们可以求出一组可行解 \(p, q\)。此时,新的方程的 \(b\) 即为原来的 \(b + a_1p\),新的方程的 \(a\) 即为原来的 \(a_1,a_2\) 的最大公倍数。
最终,合并成的一个方程,其 \(b\) 的值即为最终答案.
注意:勤取模

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef long long LL;

const int N = 100005;

int n;
LL a[N], m[N];

LL exgcd(LL a, LL b, __int128 &x, __int128 &y){
    if (!b){
        x = 1, y = 0;
        return a;
    }
    LL d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main(){
    while (scanf("%d", &n) != EOF){
        for (int i = 1; i <= n; i ++ ) scanf("%lld%lld", &m[i], &a[i]);
        LL b = a[1];
        __int128 M = m[1];
        bool flag = false;
        for (int i = 2; i <= n; i ++ ){
            __int128 p, q;
            LL d = exgcd(M, m[i], p, q);
            if (((a[i] - b % m[i] + m[i]) % m[i]) % d) {
                flag = true;
                puts("-1");
                break;
            }
            __int128 u = 1;
            p = u * p * ((a[i] - b % m[i] + m[i]) % m[i]) / d;
            LL t = abs(m[i] / d);
            p = (p % t + t) % t;
            LL m1 = M;
            M = M / d * m[i];
            b = ((u * m1 * p % M + b % M) % M + M) % M;
        }
        if (flag) continue;
        printf("%lld\n", b);
    }
    return 0;
}

标签:luoguP4777,方程,pmod,定理,int,lnsyoj517,include,LL,equiv
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj517_luoguP4777

相关文章

  • 卢卡斯定理
    1.卢卡斯定理用于求解大组合数取模的问题,其中模数必须为素数。2.卢卡斯定理的具体表述:\[C^{m}_{n}=C^{b0}_{a0}✖️C^{b1}_{a1}✖️C^{b2}_{a2}.....C^{bk}_{ak}(mod\quadp)=\prod^{k}_{i=0}C^{bi}_{ai}(mod\quadp);\](modp)表示只在模p的条件下成立这个式子又等价于\[C^{m......
  • 裴蜀定理学习记录
    1477A-NezzarandBoard观察到2x-y可以拆成x+(x-y),现在模拟一下这个过程  发现得到的数可以看成从某个点xj出发,加上若干个两数之间的差的形式。再考虑一下2x-y的几何意义,发现相当于在数轴上做x关于y的对称点,并且和数的分布位置有关,和具体数值是无关的接下来有一个不太好......
  • 裴蜀定理
    裴蜀定理Definition设d=(a,b)则存在两个整数x,y,满足:\[ax+by=d\]Solution首先带入下数据(随便两个整数)例:1410不难看出,gcd(14,10)=2辗转相除法:(a,b)=(b,amodb)\(\cfrac{14}{10}=1...4\)\(\cfrac{10}4=2...2\)\(\cfrac42=2...0\)当(amodb)=0时,结束,取最后一次的商......
  • 基础数论 欧拉定理与exgcd
    欧拉定理:若正整数\(a,n\)互质,则\(a^{\varphi(p)}\equiv1(\bmodp)\)推论(扩展欧拉定理):\[a^b\equiv\begin{cases}a^{b\\bmod\\varphi(p)}\\\\\\\\\\gcd(a,p)=1\\a^b\\\\\\\\\\\\\\\\\\\\\\gcd(a,p)!......
  • 最长不降子序列 n log n 方案输出与 Dilworth 定理 - 动态规划模板
    朴素算法不必多说,\(O(n^2)\)的暴力dp转移。优化算法时间为\(O(n\logn)\),本质是贪心,不是dp。思路是维护一个单调栈(手写版),使这个栈单调不降。当该元素\(\ge\)栈顶元素时,把这个元素压入栈中。否则,在单调栈中找到第一个大于该元素的项,把这一项改为这个元素。(因为要......
  • 【数学】【模板】欧拉定理
    欧拉定理思想若\(a\)与\(n\)互质,则\(a^{\varphi(n)}\equiv1\pmodn\);容易得出当\(n\)为质数时,\(a^{n-1}\equiv1\pmodn\)。证明假设与\(1\simn\)中与\(n\)互质的数字为\(x_1,x_2,x_3,\cdotsx_{\varphi(n)}\),且两两不同。现将它们全部乘以\(a\)得......
  • 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当
    /定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数。例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。/#include<stdio.......
  • 欧拉定理
    欧拉定理:对\(\foralla,b\)满足\((a,b)=1\),有\(a^{\varphi(b)}\equiv1\:(mod~b)\)证明:由简化剩余系的基本性质易得\(a_0a_1...a_{\varphi(m)-1}\equiv(aa_0)(aa_1)...(aa_{\varphi(m)-1})\(mod~m)\)推广:对\(\foralla,b,n\)有\(a^n\equiva^{n\:mod\:\varp......
  • 勾股定理学习笔记
    第一章勾股定理1.1勾股定理的证明对于勾股定理,有约\(500\)种证明方法。常见的有数格子(见课本勾股数)、赵爽弦图(两种)、加菲尔德证法(总统图)、毕达哥拉斯证法、华蘅芳证法、百牛定理证法、商高定理证法、商高证法、刘徽证法、绉元智证法等。这里只列出常见的几种方法。1.1.1......
  • 费马小定理-期望dp
    E-小红的树上移动(Nowcoder85687E)题目大意小红有一棵......