前置知识

中国剩余定理(CRT),逆元;

EXCRT是什么

我们知道,对于

对于

\[\begin{equation}
\begin{cases}
x \equiv c_1 \ (mod \ m_1) \\
x \equiv c_2 \ (mod \ m_2) \\
.\\
.\\
.\\
x \equiv c_i \ (mod \ \ m_i) \\
\end{cases}
\end{equation}
\]

一个一元线性同余方程组,GCT适用于模数是质数的情况,如果模数不是质数,就要用到EXGCT了;

EXCRT证明及用法

证明

首先,联立前两个式子,得

\[\begin{equation}
\begin{cases}
x \equiv c_1 \ (mod \ m_1) \\
x \equiv c_2 \ (mod \ m_2) \\
\end{cases}
\end{equation}
\]

进而

\[x = c_1 + m_1k_1 = c_2 + m_2k_2
\]
\[c_1 + m_1k_1 = c_2 + m_2k_2
\]
\[m_1k_1 = c_2 - c_1 + m_2k_2
\]

等式两边同除以$ gcd(m_1, m_2) $, 得:

\[\frac{m_1}{gcd(m_1, m_2)}k_1 = \frac{c_2 - c_1}{gcd(m_1, m_2)} + \frac{m_2}{gcd(m_1, m_2)}k_2
\]
\[\frac{m_1}{gcd(m_1, m_2)}k_1 \equiv \frac{c_2 - c_1}{gcd(m_1, m_2)} \ (mod \ \frac{m_2}{gcd(m_1, m_2)})
\]

到这里,我们就把 \(k_2\) 消掉了;

根据同余式的同乘性,同余式两边同除 $ \frac{m_1}{gcd(m_1, m_2)} $,得( $ x^{-1} $ 代表 $ x $ 在模意义下的逆元):

\[k_1 \equiv \frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ (mod \ \frac{m_2}{gcd(m_1, m_2)})
\]
\[k_1 = \frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ + \ y \ * \ \frac{m_2}{gcd(m_1, m_2)}
\]

$ y $ 是整数;

将 $ k_1 $ 带回 $ x = c_1 + m_1k_1 $ 中,得:

注意,下面的 $ (\frac{m_1}{gcd(m_1, m_2)})^{-1} $ 指的都是其在mod\(\frac{m_2}{gcd(m_1, m_2)}\) 下的逆元!

\[x = m_1\frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ + \ c_1 \ + \ y \ * \ \frac{m_1m_2}{gcd(m_1, m_2)}
\]
\[x \equiv m_1\frac{c_2 - c_1}{gcd(m_1, m_2)} \ * \ (\frac{m_1}{gcd(m_1, m_2)})^{-1} \ + \ c_1 \ (mod \ \frac{m_1m_2}{gcd(m_1, m_2)})
\]

其中,$ \frac{m_1m_2}{gcd(m_1, m_2)} = lcm(m1, m2)$;

到这,我们可以将最后一个式子与 $ x \equiv c_2 \ (mod \ m_2) $ 联立,以此类推,进行递归求解;

无解情况

显然,式子中的每个系数都应是整数,所以 $ c_2 - c_1 $ 应该能整除 $ gcd(m_1, m_2) $,若不能整除,则无解;

例题

Strange Way to Express Integers

板子;

#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
__int128 read() {
__int128 x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
} void out(__int128 x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) out(x / 10);
putchar(x % 10 + '0');
}
long long n;
__int128 m[1000005], c[1000005];
__int128 gcd(__int128 a, __int128 b) {
if (b == 0) return a;
else return gcd(b, a % b);
}
__int128 phi(long long nn) {
__int128 mm = sqrt(nn);
__int128 ans = nn;
for (__int128 i = 2; i <= mm; i++) {
if (nn % i == 0) {
ans = ans / i * (i - 1);
while(nn % i == 0) nn /= i;
}
}
if (nn > 1) ans = ans / nn * (nn - 1);
return ans;
}
__int128 qpow(__int128 a, __int128 b, __int128 p) {
__int128 ans = 1;
while(b) {
if (b & 1) ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
inline __int128 inv(__int128 a, long long b) {
__int128 pb = phi(b);
return qpow(a, pb - 1, b);
}
int main() {
while(scanf("%lld", &n) != EOF) {
bool v = true;
for (int i = 1; i <= n; i++) {
m[i] = read();
c[i] = read();
}
for (int i = 2; i <= n; i++) {
__int128 m1 = m[i - 1], m2 = m[i], c1 = c[i - 1], c2 = c[i];
__int128 g = gcd(m1, m2);
if ((c2 - c1) % g != 0) {
printf("%d\n", -1);
v = false;
break;
}
m[i] = (m1 * m2) / g;
c[i] = inv(m1 / g, (long long)m2 / g) * (c2 - c1) / g * m1 + c1;
c[i] = (c[i] % m[i] + m[i]) % m[i];
}
if (!v) continue;
out(c[n]); //最后c[n]为答案,且c[n]是答案中最小的,因为其已经mod了所有m[i];
printf("\n");
}
return 0;
}

扩展中国剩余定理证明及例题 Strange Way to Express Integers的更多相关文章

  1. 中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)

    0.引子 每一个讲中国剩余定理的人,都会从孙子的一道例题讲起 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 1.中国剩余定理 引子里的例题实际上是求一个最小的x满足 关键是,其中 ...

  2. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  3. poj 2981 Strange Way to Express Integers (中国剩余定理不互质)

    http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 13 ...

  4. Strange Way to Express Integers(中国剩余定理+不互质)

    Strange Way to Express Integers Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%I64d & ...

  5. poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9472   ...

  6. [POJ 2891] Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 10907 ...

  7. poj——2891 Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 16839 ...

  8. POJ2891——Strange Way to Express Integers(模线性方程组)

    Strange Way to Express Integers DescriptionElina is reading a book written by Rujia Liu, which intro ...

  9. 一本通1635【例 5】Strange Way to Express Integers

    1635:[例 5]Strange Way to Express Integers sol:貌似就是曹冲养猪的加强版,初看感觉非常没有思路,经过一番艰辛的***,得到以下的结果 随便解释下给以后的自己 ...

  10. POJ2891 Strange Way to Express Integers

    题意 Language:Default Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total S ...

随机推荐

  1. SQLmap 爆破

    1.Sqlmap  -u "http://114.67.246.176:11055/index.php?" --data="id=1"   (这里  --dat ...

  2. IDEA 报错 project is already registered

    1.环境&背景 有时候IEDA下一个工程中想引入多个项目,只能添加多个modules. 版本:IDEA 2020.2 构建:gradle 2.问题 有时候删掉了某个项目再导入时报错 proje ...

  3. Zabbix“专家坐诊”第192期问答汇总

    问题一 Q:请问下,客户机snmptrap发告警为啥server web收不到,关键是snmptrap日志已经收到,zabbix server配置以及开启snmptrap=1 snmptrap=var ...

  4. RocketMQ为什么这么快?我从源码中扒出了10个原因!

    大家好,我是三友~~ RocketMQ作为阿里开源的消息中间件,深受广大开发者的喜爱 而这其中一个很重要原因就是,它处理消息和拉取消息的速度非常快 那么,问题来了,RocketMQ为什么这么快呢? 接 ...

  5. sentienl

    整合springboot Spring Cloud Alibaba Sentinel 下载 导入依赖 <dependency> <groupId>com.alibaba.clo ...

  6. 软件推荐 Notable / 现改用 Vnote 了

    https://notable.app/#download

  7. 【图算法】图卷积的演变-从谱图卷积到GCN

    基础 傅里叶变换 傅里叶级数是对周期为T的确定性信号做展开,而傅里叶变换将周期推广到无穷,能对具有任意长度的信号做展开. 傅里叶级数和傅里叶变换是什么关系? 如下为傅里叶变换公式: \[\hat{f} ...

  8. 原型&继承题目及内容解答

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 代码输出结果 function Person(name) { this.name = name } var p2 = new Per ...

  9. 记录--vue组件划分的思考

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 对vue项目来说,组件是构成项目的基本单元,为了方便理解,这里定义两类组件:页面组件,功能组件.为什么需要划分这两类组件是从组件复用来考虑 ...

  10. objective-c之Class底层结构探索

    isa 走位图 在讲 OC->Class 底层类结构之前,先看下下面这张图: 通过isa走位图 得出的结论是: 1,类,父类,元类都包含了 isa, superclass 2,对象isa指向类对 ...