传送门
借此题复习一下中国剩余定理。
题意:
此题可简化成求同余方程的解(
a
1
.
.
.
a
n
互
质
a_1...a_n互质
a1...an互质):
x
m
o
d
a
1
=
b
1
x\ mod\ a_1=b_1
x mod a1=b1
x
m
o
d
a
2
=
b
2
x\ mod\ a_2=b_2
x mod a2=b2
x
m
o
d
a
3
=
b
3
x\ mod\ a_3=b_3
x mod a3=b3
…
x
m
o
d
a
n
=
b
n
x\ mod\ a_n=b_n
x mod an=bn
直接求出
x
x
x的值不太现实,于是将问题转化为求以下
x
1
.
.
.
x
n
x_1...x_n
x1...xn的解:
x
1
m
o
d
a
1
=
b
1
x_1\ mod\ a_1=b_1
x1 mod a1=b1
x
2
m
o
d
a
2
=
b
2
x_2\ mod\ a_2=b_2
x2 mod a2=b2
x
3
m
o
d
a
3
=
b
3
x_3\ mod\ a_3=b_3
x3 mod a3=b3
…
x
n
m
o
d
a
n
=
b
n
x_n\ mod\ a_n=b_n
xn mod an=bn
而
∑
x
1
x
n
\sum_{x_1}^{x_n}
∑x1xn就是答案,当然,对于每一个
x
i
x_i
xi,我们还需要制定额外的限制条件,以保证
∑
x
1
x
n
\sum_{x_1}^{x_n}
∑x1xn可以作为答案:
对于
x
i
x_i
xi,我们需要让它能够整除
a
1
a_1
a1到
a
n
a_n
an中除
a
i
a_i
ai之外的所有数,即:
x
i
x_i
xi必须要是
(
∏
j
=
1
n
a
j
)
/
a
i
(\prod_{j=1}^{n}a_j)/a_i
(∏j=1naj)/ai的倍数并且
x
i
m
o
d
a
i
=
b
i
x_i\ mod\ a_i=b_i
xi mod ai=bi。
首先设prod为
∏
j
=
1
n
a
j
\prod_{j=1}^{n}a_j
∏j=1naj,对于
a
i
a_i
ai,我们来罗列一下它的限制条件:
{
x
i
m
o
d
a
i
=
b
i
x
i
∣
(
p
r
o
d
/
a
i
)
\begin{cases} x_i\ mod\ a_i=b_i \\ x_i|(prod/a_i) \end{cases}
{xi mod ai=bixi∣(prod/ai)
也就是说,我们要在除了
a
i
a_i
ai之外的所有模数的乘积(即
p
r
o
d
/
a
i
prod/a_i
prod/ai)倍数中,找到一个模
a
i
a_i
ai等于
b
i
b_i
bi的数,但在这里我们不选择枚举的方式,而是通过找到
p
r
o
d
/
a
i
prod/a_i
prod/ai模
a
i
a_i
ai下的逆元,再乘上模数
b
i
b_i
bi,从而得到
x
i
x_i
xi。
那么,为什么采取这种方式去得到
x
i
x_i
xi?
首先看一下逆元的定义:
设d为a模b下的逆元,则:
a
∗
d
≡
1
(
m
o
d
b
)
a*d\equiv1(mod\ b)
a∗d≡1(mod b),即:
a
∗
d
m
o
d
b
=
1
a*d\ mod\ b=1
a∗d mod b=1,
此外,要引入一条定理:
若
a
1
m
o
d
b
=
c
,
且
a
2
m
o
d
b
=
c
/
2
a_1\ mod\ b=c,且a_2\ mod\ b=c/2
a1 mod b=c,且a2 mod b=c/2,则
a
1
=
2
∗
a
2
a_1=2*a_2
a1=2∗a2
于是,求出逆元
d
i
d_i
di后,
a
i
∗
d
i
m
o
d
b
=
1
a_i*d_i\ mod\ b=1
ai∗di mod b=1,而
a
i
∗
d
i
∗
b
i
m
o
d
b
i
=
b
i
a_i*d_i*b_i\ mod\ b_i=b_i
ai∗di∗bi mod bi=bi。
在这题上就是:用
p
r
o
d
/
a
i
∗
模
b
i
的
逆
元
prod/a_i*模b_i的逆元
prod/ai∗模bi的逆元得到一个
p
r
o
d
/
a
i
prod/a_i
prod/ai的倍数且模
b
i
b_i
bi为1的数,再乘上相应的模数
b
i
b_i
bi即可得到一个满足上述限制条件表达式的值。
于是最后的答案就是:
∑
x
1
x
n
\sum_{x_1}^{x_n}
∑x1xn,而最小的答案为
∑
x
1
x
n
m
o
d
p
r
o
d
\sum_{x_1}^{x_n}\ mod\ prod
∑x1xn mod prod
最终答案的表达式为:
x
=
(
∑
i
=
1
n
p
r
o
d
/
a
i
∗
(
p
r
o
d
/
a
i
)
−
1
∗
b
i
)
x=(\sum_{i=1}^{n}prod/a_i*(prod/a_i)^{-1}*b_i)
x=(∑i=1nprod/ai∗(prod/ai)−1∗bi),其中
(
p
r
o
d
/
a
i
)
−
1
(prod/a_i)^{-1}
(prod/ai)−1为
(
p
r
o
d
/
a
i
)
−
1
(prod/a_i)^{-1}
(prod/ai)−1模
b
i
b_i
bi下的逆元。
这题的ac代码:
顺便说一下求逆元要用扩展欧几里得求解,费马小定理要求模数为质数,扩欧只要求互质,即逆元存在。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100010],b[100010];
void exgcd(ll a, ll b, ll &x, ll &y)
{
if (!b)
{
x = 1;
y = 0;
return;
}
exgcd(b, a % b, x, y);
ll temp = x;
x = y;
y = temp - (a / b) * y;
}
int main()
{
int n;
cin>>n;
ll sum = 1;
for(int i = 1; i <= n; i++)
{
cin>>a[i]>>b[i];
sum*=a[i];
}
ll ans = 0;
for(int i = 1; i <= n; i++)
{
ll x=0,y=0;
exgcd(sum/a[i],a[i],x,y);
ans += sum*b[i]*(x > 0?x:x+a[i]);
}
cout<<ans%sum<<endl;
}