首页 > 其他分享 >扩展中国剩余定理证明及例题 Strange Way to Express Integers

扩展中国剩余定理证明及例题 Strange Way to Express Integers

时间:2024-04-15 16:46:14浏览次数:34  
标签:__ Integers frac gcd Express int128 例题 equiv mod

前置知识

中国剩余定理(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)}) \]

到这,我们可以将最后一个式子与 $ 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;
}

标签:__,Integers,frac,gcd,Express,int128,例题,equiv,mod
From: https://www.cnblogs.com/PeppaEvenPig/p/18136340

相关文章

  • 论文解读(Polynormer)《Polynormer: Polynomial-Expressive Graph Transformer in Linea
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]2024年4月14日17:13:41论文信息论文标题:Polynormer:Polynomial-ExpressiveGraphTransformerinLinearTime论文作者:论文来源:2024 aRxiv论文地址:download论文代码:download视屏讲解:click1-摘要图转换器(GTs)已经成为一种......
  • C# 好用的Expression动态拼接帮助类
    publicstaticclassExpressionHandle{///<summary>///Linq的And操作///</summary>///<typeparamname="T"></typeparam>///<paramname="first"></param>///<paramname=&qu......
  • SpringBoot+Redis启动报错Unsatisfied dependency expressed through method 'stringR
    SpringBoot+Redis启动报错Applicationrunfailedorg.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'redisTool':Unsatisfieddependencyexpressedthroughfield'stringRedisTemplate';nestedexcep......
  • [POJ2891]Strange Way to Express Integers公式推导
    没啥事干,想着推个式子玩玩。题目链接题意不过多赘述,直接上过程:由题意得\[\begin{cases}x\equiva_1\,(mod\,\,n_1)\\x\equiva_2\,(mod\,\,n_2)\end{cases}\]展开得\[x=k_1·n_1+a_1=k_2·n_2+a_2\dots①\]移项得\[k_1·n_1=(a_2-a_1)+k_2·n_2\]\[k_1·n......
  • [笔记]数位dp例题及详解-下
    【接上回】-数位dp例题及详解-上共\(4\)道难度较高、较有思考性的题。附上数位dp题单:https://www.luogu.com.cn/training/494976#problems小小的总述:数位dp是这样的,状态表示越简洁,dp数组越小巧,进而时空消耗就越少。所以我们刷题的时候,可以先无脑把\(f\)数组的每一维都设为与......
  • Devexpress 控件学习记录(一:BarManager 控件、XtraTabbedMdiManager 控件)
    BarManager控件最终实现的效果如下:首先在窗体中拖出BarManager控件,窗体Baradd地方点击添加设置BarManager的属性设置出现的窗体的底部【DockStyle=Bottom】点击AddDropDownMenu添加下拉菜单出现下拉菜单设置下拉菜单中的子菜单选中下拉菜单,然后点击下面的Add......
  • 界面控件DevExpress WinForms/WPF v23.2 - 富文本编辑器支持内容控件
    众所周知内容控件是交互式UI元素(文本字段、下拉列表、日期选择器),用于在屏幕上输入和管理信息。内容控件通常在模板/表单中使用,以标准化文档格式和简化数据输入。DevExpress文字处理产品库(WordProcessingDocumentAPI、WinForm和WPF富文本编辑器)附带了内容控制支持(v23.2+)。具......
  • DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!UI自动化测试利用特定的工具/框架来模拟用户与界面的......
  • Node.js毕业设计基于个人阅读习惯的个性化推荐系统研究(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着互联网的普及和数字化阅读的兴起,个人阅读习惯在信息时代扮演着越来越重要的角色。个性化推荐系统作为满足用户个性化需求的有效工具,已经成为数字阅读平......
  • Node.js毕业设计基于高校新生报到(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的不断发展,高校新生报到系统已经成为了各大高校必备的管理工具之一。传统的新生报到方式存在着效率低下、信息不准确、工作量大等问题,而基于网......