首页 > 其他分享 >中国剩余定理模板

中国剩余定理模板

时间:2023-02-15 11:33:52浏览次数:45  
标签:剩余 ch CRT int 定理 flag ll 模板 getchar

using ll = __int128;

template <typename T>
inline void rd(T &data) {
    T x = 0, flag = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch=='-') flag = flag * -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    data = x * flag;
}
template <typename T>
void wt(T x) {
     if (x < 0) putchar('-'), x = -x;
     if (x > 9) wt(x / 10);
     putchar(x % 10 + '0');
}

int n;
struct CRT {
    constexpr static int N = 30;
    ll a[N] {}, b[N] {};

    CRT() = default;
    CRT(int n) {
        for (int i = 1; i <= n; ++i) {
            rd(a[i]), rd(b[i]);
        }
    }
    ll exgcd(ll a, ll b, ll &x, ll &y) {
        if (!b) {
            x = 1, y = 0;
            return a;
        }
        ll d = exgcd(b, a % b, y, x);
        y -= a / b * x;
        return d;
    }
    ll getCRT() {  // 中国剩余定理
        ll M = 1;
        for (int i = 1; i <= n; i++) {
            M *= a[i];
        }
        ll res = 0;
        for (int i = 1; i <= n; i++) {
            ll Mi = M / a[i];
            ll x, y;
            exgcd(Mi, a[i], x, y);
            x = (x + a[i]) % a[i];
            res += b[i] * Mi * x;
        }
        return res % M;
    }
    ll getEXCRT() {  // 扩展中国剩余定理
        bool flag = true;
        ll a1 = a[1], b1 = b[1];
        for (int i = 2; i <= n; i++) {
            ll a2 = a[i], b2 = b[i], k1, k2;
            ll d = exgcd(a1, a2, k1, k2);
            if ((b2 - b1) % d) {
                flag = false;
                break;
            }
            k1 *= (b2 - b1) / d;
            k1 = (k1 % (a2 / d) + a2 / d) % (a2 / d);
            b1 = a1 * k1 + b1;
            a1 = a1 / d * a2;
            if (a1 < 0) {
                a1 = -a1;
            }
        }
        if (!flag) {
            return -1;
        } else {
            return (b1 % a1 + a1) % a1;
        }
    }
};

标签:剩余,ch,CRT,int,定理,flag,ll,模板,getchar
From: https://www.cnblogs.com/hacker-dvd/p/17122167.html

相关文章

  • hadoop模板虚拟机配置
    在安装好虚拟机软件后,进行IP配置 配置windows系统的ip 配置Vmware的ip 配置虚拟机的ip首先输入suroot切换至root身份。然后配置ip和网关vim/etc/sysconfig......
  • JDBC 修改记录操作模板
    importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.Statement;publicclassUpdata{publicstaticvoidm......
  • JDBC 删除记录操作模板
    importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.Statement;publicclassDelete{publicstaticvoidm......
  • 矩阵树定理
    没有证明,快逃。概念矩阵树定理,用于一类图论问题的生成树计数。通常给出一个有向图或无向图,需要求出图中的内向生成树/外向生成树/生成树的个数/权值乘积之和等......
  • 优维低代码:Legacy Templates 构件模板
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维......
  • 【OpenCV】- 模板匹配(浩瀚星空只为寻找那一抹明月)
    ......
  • P1177 【模板】快速排序
    P1177【模板】快速排序快速排序模板1#include<iostream>2#include<cstring>3usingnamespacestd;4inta[100010],n;5intt[100010];6voidmsort(in......
  • react-native模板
    expo升级SDK38后,原本创建项目时可选的导航模板变成了由typescript写的模板,于是自己还是js写一个,以下是效果地址​​https://github.com/tangmusenLiu/react-native-templat......
  • 回文树模板
    资料感谢:模板源于不知名ACM大神,如果有侵权,立即删除。我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最大出现值。 ......
  • J - 【黄色】这题真的是模板题 Gym - 102072J 【 SPFA 】
    J-【黄色】这题真的是模板题 Gym-102072J 在看完其他出题人出的毒瘤题之后,良心出题人终于看不下去了,决定出一道模板题来送给大家一个AC,那么,你们能不能接住这个......