前置知识

中国剩余定理(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. CodeCraft-22 and Codeforces Round 795 (Div. 2)C. Sum of Substrings(分类讨论、贪心)

    感觉分类讨论的能有点弱.遇到复杂一点的分类讨论的题目,代码就写的巨长. 首先观察到处在中间位置的1对答案的贡献是11,具体在中间哪个位置是没有关系的. 只有两端的两个位置是比较特殊的 \(1位置处的1 ...

  2. 添加 alt + d 打开 dicts.cn 网址

    代码 autohotkey 代码 限制在双核浏览器 内部使用 #IfWinActive ahk_exe ChromeCore.exe !d:: Run, http://www.dicts.cn/ Re ...

  3. archlinux 使用ventoyU盘启动器(ISO)

    ventoy详细介绍https://www.ventoy.net/cn/doc_start.html Linux系统安装 Ventoy -- 命令行界面 下载安装包,例如 ventoy-1.0.00- ...

  4. 基于ads1299的可穿戴脑电信号采集之性能调试总结

    一 前言 问题背景: 最近做项目,遇到了一个问题,就是采集的信号有噪声,在这里做了很多尝试.   二 测试步骤 A 内部方波信号质量,通过测试发现内部方波信号质量特别好.这个说明了软件和存储这块,没啥 ...

  5. -Dmaven.multiModuleProjectDirectory system propery is not set解决方案

    myeclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery ...

  6. 三维模型(3D)OBJ格式轻量化云端处理技术方法探讨

    三维模型OBJ格式轻量化处理技术方法浅析 维模型的OBJ格式轻量化处理技术方法旨在减小模型文件大小.提高加载性能和优化渲染效果.本文将对三维模型OBJ格式轻量化处理技术方法进行浅析,并探讨其在数据压缩 ...

  7. WPF状态保存

    由于WPF做客户端的时候,它不像BS那样有Session,Cookie给你使用,所以保存状态你首先想到的就是数据库了. 但是你不可能什么都放在数据库,为此还专门为它建立一张表. 而WPF中能用到的除了 ...

  8. 记录--手把手带你开发一个uni-app日历插件(并发布)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能.但 ...

  9. 使用小皮面板新建站点配置SSL证书

    1.新建站点 2,点开配置->SSL,将证书内容复制进去,点击保存后会在"配置文件"生成一个serve{}代码块 3,删掉默认的serve{},保留经过SSL生成的serve ...

  10. AXI-自定义IP-PS设计

    基于AXI4的自定义IP核的设计 1.实验目标 利用vivado中内置的AXI总线初始化的IP核设计工具,将自己设计的流水灯的PL代码打包成IP核外设,挂在PS上,通过PS上的按钮控制流水灯的开始和结 ...