概述
【模板】中国剩余定理(CRT)/曹冲养猪
题目链接:luogu P1495
题目大意
给你一些条件,要你找最小的 x,使得满足它被一些数取模的答案是要求的数。
且模数相互都是互质的。
思路
我们考虑我们先让每个式子单独找数满足,这个很好找,我们可以找到
x
1
,
x
2
,
.
.
.
x
n
x_1,x_2,...x_n
x1,x2,...xn。
那你考虑搞
x
1
+
x
2
x_1+x_2
x1+x2,看他能不能同时满足两个式子。
那你要想,那你为了不破坏余数,那你
x
2
x_2
x2 要是
a
1
a_1
a1 的倍数,
x
1
x_1
x1 要是
a
2
a_2
a2 的倍数。
那你以此类推,变成所有的加起来,那就是要
x
1
x_1
x1 是
a
2
,
a
3
,
.
.
.
,
a
n
a_2,a_3,...,a_n
a2,a3,...,an 的倍数,
x
2
x_2
x2 是
a
1
,
a
3
,
.
.
.
,
a
n
a_1,a_3,...,a_n
a1,a3,...,an 的倍数,.……。
这个很好找,就先搞出所有
a
a
a 的最小公倍数,然后除去
a
i
a_i
ai 就行。
那接着你
x
i
x_i
xi 还要满足模
a
i
a_i
ai 是
b
i
b_i
bi,那这一步要怎么处理呢?
那你要求
LCM
×
m
≡
b
i
(
m
o
d
a
i
)
text{LCM}times mequiv b_i(bmod a_i)
LCM×m≡bi(mod ai)
不如先求
LCM
×
m
≡
1
(
m
o
d
a
i
)
text{LCM}times mequiv 1(bmod a_i)
LCM×m≡1(mod ai),然后再拿结果乘
b
i
b_i
bi。
然后不难看出
m
m
m 就是
LCM
text{LCM}
LCM 关于
a
i
a_i
ai 的逆元。
那你就求得了
x
1
,
x
2
,
.
.
.
,
x
n
x_1,x_2,...,x_n
x1,x2,...,xn。
加起来就是一个解了。
但是我们要求最小解,那我们考虑通解。
那模
a
i
a_i
ai 的余数什么时候回循环一次呢?(完全匹配的那种)
不难想到是
lcm
{
a
i
}
text{lcm}{a_i}
lcm{ai} 个循环一次。
那就把答案模
L
C
M
LCM
LCM 就可以了。
代码
#include<cstdio>
#define ll long long
using namespace std;
int n;
ll a[11], b[11], LCM, X;
ll gcd(ll x, ll y) {
if (!y) return x;
return gcd(y, x % y);
}
ll exgcd(ll a, ll b, ll &x, ll &y) {//exgcd 求逆元
if (!b) {
x = 1;
y = 0;
return a;
}
ll re = exgcd(b, a % b, y, x);
y -= x * (a / b);
return re;
}
int main() {
scanf("%d", &n);
LCM = 1;
for (int i = 1; i <= n; i++) {
scanf("%lld %lld", &a[i], &b[i]);
LCM = LCM * a[i] / gcd(LCM, a[i]);//求积
}
for (int i = 1; i <= n; i++) {
ll mi = LCM / a[i];
ll x = 0, y = 0;
exgcd(mi, a[i], x, y);
X += b[i] * mi * ((x % a[i] + a[i]) % a[i]);//注意 x 有可能是负数
}
printf("%lld", X % LCM);
return 0;
}
最后
以上就是奋斗心情为你收集整理的【luogu P1495】【模板】中国剩余定理(CRT)/曹冲养猪(数论)【模板】中国剩余定理(CRT)/曹冲养猪的全部内容,希望文章能够帮你解决【luogu P1495】【模板】中国剩余定理(CRT)/曹冲养猪(数论)【模板】中国剩余定理(CRT)/曹冲养猪所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复