首页 > 其他分享 >拓展中国剩余定理(excrt)

拓展中国剩余定理(excrt)

时间:2023-07-14 14:44:23浏览次数:32  
标签:剩余 gcd int 定理 register times excrt lambda lld

由于exCRT完美的平替了CRT的全部功能,故不再详细复习CRT的相关内容.

考虑如下同余方程组,

\[\begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \\ \end{cases} \]

展开得,

\[a_1 + k_1 \times m_1 = a_2 + k_2 \times m_2 \]

\[\Rightarrow k_1 \times m_1 - k_2 \times m_2= a_2 - a_1 \]

该式子左侧类似裴蜀定理, 则存在 \(\lambda_1, \lambda_2\) 满足 \(\lambda_1 \times m_1 + \lambda_2 \times m_2= gcd(m_1, m_2)\)

当 \(gcd(m_1, m_2) \nmid a_2 - a_1\) 时, 方程组无解.

当 \(gcd(m_1, m_2) \mid a_2 - a_1\) 时, 存在 \(k_1 , k_2\) 满足 \(k_1 \times m_1 - k_2 \times m_2= a_2 - a_1\).

则特解 \(x^* = \frac{a_2 - a_1}{gcd(m_1, m_2)} \times \lambda_1 \times m_1\), 根据CRT的相关内容,得到通解

\[x = \frac{a_2 - a_1}{gcd(m_1, m_2)} \ \lambda_1 \ m_1 + k_1 \cdot lcm(m_1, m_2) \]

考虑由多个同余方程组成的方程组,上面通解可表达成

\[x \equiv \frac{a_2 - a_1}{gcd(m_1, m_2)} \ \lambda_1 \ m_1 \pmod{lcm(m_1, m_2)} \]

由此,以此从方程组中选出两个同余方程进行合并,显然不失一般性。

点击查看代码
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1e5 + 50;
typedef long long lld;

inline int read() {
	register int w = 0, f = 1;
	register char c = getchar();
	while (c > '9' || c < '0') {
		if (c == '-')  f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		w = w * 10 + c - '0';
		c = getchar();
	}
	return w * f;
}

int n;
lld a1, a2, m1, m2;

inline lld gcd(register lld a, register lld b) {
	return (!b ? a : gcd(b, a % b));
}

inline lld mul(register lld a, register lld b, register lld p) {
	lld ans = 0;
	while (b) {
		if (b & 1)  ans = (ans + a) % p;
		a = (a + a) % p;
		b >>= 1;
	}
	return ans;
}

inline lld exgcd(register lld a, register lld b, lld &x, lld &y) {
	if (!b) {
		x = 1;
		y = 0;
		return a;
	}
	register lld g = exgcd(b, a % b, x, y);
	register lld tmp = x;
	x = y;
	y = tmp - a / b * y;
	return g;
}

int main(){
	n = read();
	scanf("%lld%lld", &m1, &a1);
	for (register int i = 2; i <= n; ++i) {
		scanf("%lld%lld", &m2, &a2);
		register lld x, y;
		register lld g = exgcd(m1, m2, x, y);
		register lld t = m2 / g;
		x = (x % t + t) % t;
		register lld tmp = m1 / g * m2;
		a1 = (a1 + mul(mul((a2 - a1) / g, x, tmp), m1, tmp) + tmp) % tmp;
		m1 = tmp;
	}
	printf("%lld\n", a1);
	return 0;
}

标签:剩余,gcd,int,定理,register,times,excrt,lambda,lld
From: https://www.cnblogs.com/abigjiong/p/17553622.html

相关文章

  • 【真·随笔】矩证乘法的基本定理(修复)
    此随笔是修复版,请尊重原创。修复版markdown见下修复自矩阵乘法笔记-Elegia:https://www.luogu.com.cn/blog/EntropyIncreaser/ju-zhen-sheng-fa-bi-ji矩阵乘法的基本定理矩阵乘法结合律设有矩阵\(A,B,C\),分别的大小为\(n\timesm,m\timesp,p\timesq\)。求证......
  • 二次剩余
    二次同余式二次同余式是关于未知数的二次多项式的同余方程。即:\(ax^2+bx+c\equiv0\bmod\m\)是一个二次同余方程。此外,称\(x^2\equiva\bmod\m\)为最简二次同余式,或称最简二次同余方程。一般的,通过配方,可以把一个一般的二次同余方程转化为一个最简二次同余式接下来只需要......
  • 如何实现redis 订单剩余支付时间的具体操作步骤
    Redis订单剩余支付时间简介在电子商务应用中,订单通常需要设置一个支付截止时间。为了实现这一功能,我们可以使用Redis来存储订单的剩余支付时间。Redis是一个高性能的内存键值数据库,适用于缓存、消息队列、实时分析等场景。本文将介绍如何使用Redis存储订单的剩余支付时间,......
  • 卢卡斯定理
     卢卡斯定理的原式:C(n,r)modm=C(n1,r1)*C(n2,r2)*......*C(nk,rk)modm卢卡斯定理的变式:C(n,r)modm=C(nmodm,rmodm)*C(n/m,r/m)modm卢卡斯定理的时间复杂度很低,接近O(n)下面给出一道例题P3807【模板】卢卡斯定理/Lucas定理代码:#include<bits/stdc++.h>#def......
  • P4139(扩展欧拉定理的应用)
    欧拉定理及扩展题意:求思路:运用扩展欧拉定理进行欧拉降幂:然后递归求解即可。AC代码://-----------------//#pragmaGCCoptimize(2)#include<iostream>#include<cstring>#include<algorithm>#defineIOSios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0)......
  • 二项式定理和杨辉三角
     杨辉三角解法1:dfs使用记忆化搜索,提升dfs效率代码:intdfs(intn,intm){ if(!m)returnc[n][m]=1; if(m==1)returnc[n][m]=n; if(c[n][m])returnc[n][m]; if(n-m<m)m=n-m; returnc[n][m]=(dfs(n-1,m)+dfs(n-1,m-1))%mod;}解法2:递推时间复杂度O(n^2),如果......
  • 【模板】唯一分解定理
    问题描述任何大于\(1\)的正整数都能唯一分解为有限个质数的乘积:          \(N=p_1^{c_1}p_2^{c_2}...p_k^{c_k}\)其中\(p_1,p_2,\dots,p_k\)从小到大排列输入数据      一个数\(n(n\le10^{17})\)输出数据      将其质因数与其次数顺序输出   ......
  • 立体几何八大定理
    线面平行判定定理:平面外一条直线与平面内一条直线平行,则这条直线和这个平面平行。符号语言:\[a\not\subset\alpha,b\subset\alpha,a/\kern-0.10em/b\Longrightarrowa/\kern-0.10em/\alpha\]性质定理:一条直线和平面平行,经过这条直线的平面这这个平面相交,那么这条直线和交......
  • 【补】托勒密定理
    托勒密定理定理内容在数学中,托勒密定理是欧几里得几何学中的一个关于四边形的定理。托勒密定理指出凸四边形两组对边乘积之和不小于两条对角线的乘积,等号当且仅当四边形为圆内接四边形,或退化为直线取得(这时也称为欧拉定理)。狭义的托勒密定理也可以叙述为:圆内接凸四边形两对对边......
  • ES6 的 新特性 4 剩余参数,对象值省略
    剩余参数用于声明不确定参数数量的函数functionsum(first,...args){console.log(first);//10console.log(args);//[20,30]}sum(10,20,30)箭头函数也可以用constsum=(...args)=>{lettotal=0;args.forEach(item=>total+=i......