• CRT和EXCRT学习笔记


    蒟蒻maomao终于学会(CRT)啦!发一篇博客纪念一下(还有防止忘掉)

    (CRT)要解决的是这样一个问题:

    $$x≡a_1​(mod m_1​)$$

    $$x≡a_2​(mod m_2​)$$

    $$x≡a_3​(mod m_3​)$$

    $$...$$

    $$x≡a_k​(mod m_k​)​$$

    其中,(m)之间两两互质。这个问题有一个通解是(sum a_i * M * t_i / m_i),其中(t_i)代表方程(M * t_i / m_i ≡ 1)的最小正整数解。

    为什么它是对的呢?对于任意一个式子(x≡a_j(mod m_j)),通解中(i = j)的部分会贡献(a_i)的余数,而其它部分会贡献(0)的余数。

    更一般的,我们来考虑如果(m)之间不互质的情况,由于打公式很累,所以详细请参考这个博客

    发一下(exCRT)的板子。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    
    const int N = 100010;
    
    int n, bi[N], ai[N];
    
    int add (int a, int b, int mod) {
    	return ((a + b) % mod + mod ) % mod;
    }
    
    int mul (int a, int b, int mod) {
        int res = 0;
        while (b > 0) {
            if (b & 1) {
    			res = (res + a) % mod;
    		}
            a = (a + a) % mod;
            b >>= 1;
        }
        return res;
    }
    
    int exgcd (int a, int b, int &x, int &y) {
        if (b == 0) {
    		x = 1;
    		y = 0;
    		return a;
    	}
        int gcd = exgcd (b, a % b, x, y);
        int xx = y, yy = x - (a / b) * y;
        x = xx, y = yy;
    	return gcd;
    }
    
    int excrt () {
        int x, y;
        int M = ai[1], ans = bi[1]; //通解是b[1] + a[1] * t ≡b[2] (mod a[2]); 
    	for(int i = 2; i <= n; ++i) {
    		//M * x + a[i] * y = b[i] - ans;
    		//其中 ans + M * x % lcm (M, b[i]) 就是新的通解 
            //求出来的x是对于gcd (M, a[i])而言,所以要乘上c / gcd (M, a[i]); 
    		int a = M, b = ai[i], c = add (bi[i], -ans, b);
            int gcd = exgcd (a, b, x, y), bg = b / gcd;
            x = mul (x, c / gcd, ai[i]);
            ans += x * M;//更新前k个方程组的答案
            M *= bg;//M为前k个m的lcm
            ans = (ans %M + M) % M;
        }
        return ans;
    }
    
    signed main () {
        cin >> n;
    	for (int i = 1; i <= n; ++i) {
    		cin >> ai[i] >> bi[i]; //b是余数,a是模数。 
    	}
    	cout << excrt () << endl;
        return 0;
    }
    
  • 相关阅读:
    delphi7 stringgrid 点列头排序
    如何作为一个优秀的ERP实施顾问
    小米生态链去年收入150亿,今年目标200亿
    msys2 安装笔记(可以按照这个关键字搜索)
    MinGW 编译 libsndfile-1.0.25(只要有 MSYS,./configure make make install 就行了)
    Apache Ignite——新一代数据库缓存系统
    VS2015 C#6.0
    Webuploader 大文件分片上传
    requirejs
    require.js
  • 原文地址:https://www.cnblogs.com/maomao9173/p/10484300.html
Copyright © 2020-2023  润新知