同余
定义
若整数 a a a和整数 b b b除以正整数 m m m的余数相同则称 a a a, b b b m o d mod mod m m m 同余记作 a ≡ b ( m o d a\equiv b (mod a≡b(mod m ) m) m).
同余的一些小性质
同加性:若
a
≡
b
(
m
o
d
m
)
a\equiv b(mod\ m)
a≡b(mod m),则
a
+
c
≡
b
+
c
(
m
o
d
m
)
a+c\equiv b+c(mod\ m)
a+c≡b+c(mod m)
同乘性:若
a
≡
b
(
m
o
d
m
)
a\equiv b(mod\ m)
a≡b(mod m),则
a
×
c
≡
b
×
c
(
m
o
d
m
)
a\times c \equiv b\times c(mod\ m)
a×c≡b×c(mod m),若
a
≡
b
(
m
o
d
m
)
,
c
≡
d
(
m
o
d
m
)
a\equiv b(mod\ m) , c\equiv d (mod\ m)
a≡b(mod m),c≡d(mod m),则
a
×
c
≡
b
×
d
(
m
o
d
m
)
a\times c \equiv b\times d (mod\ m)
a×c≡b×d(mod m)
同幂性:若
a
≡
b
(
m
o
d
m
)
a\equiv b(mod\ m)
a≡b(mod m),则
a
c
≡
b
c
(
m
o
d
m
)
a^c\equiv b^c(mod\ m)
ac≡bc(mod m)
a
×
b
%
k
=
(
a
%
k
)
×
(
b
%
k
)
%
k
a\times b\%\ k=(a\%k)\times(b\%k)\%k
a×b% k=(a%k)×(b%k)%k
费马小定理
若 p p p是质数,则对于任意整数 a a a,有 a p ≡ a ( m o d a^p\equiv a(mod ap≡a(mod p ) p) p).
扩展欧几里得
Bezout定理
对于任意整数
a
a
a,
b
b
b存在一对整数
x
x
x,
y
y
y满足
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax+by=gcd(a,b)
ax+by=gcd(a,b).
证明:
根据欧几里得定理,我们可以知道
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
gcd(a,b)=gcd(b,a
gcd(a,b)=gcd(b,a
m
o
d
mod
mod
b
)
b)
b),假设有一组数
x
,
y
x,y
x,y,
满足
b
∗
x
+
(
a
−
b
⌊
a
b
⌋
)
y
b*x+(a-b\lfloor\frac{a}{b}\rfloor)y
b∗x+(a−b⌊ba⌋)y;可以得到
a
∗
y
+
b
(
x
−
⌊
a
b
⌋
∗
y
)
a*y+b(x-\lfloor\frac{a}{b}\rfloor*y)
a∗y+b(x−⌊ba⌋∗y)
令
x
′
=
y
,
y
′
=
(
x
−
⌊
a
b
⌋
∗
y
)
x'=y,y'=(x-\lfloor\frac{a}{b}\rfloor*y)
x′=y,y′=(x−⌊ba⌋∗y),则可以得到
a
x
′
+
b
y
′
=
g
c
d
(
a
,
b
)
ax'+by'=gcd(a,b)
ax′+by′=gcd(a,b).
可以往下推到
b
=
0
b=0
b=0时,显然有
x
=
1
,
y
=
0
x=1,y=0
x=1,y=0成立.
根据数学归纳法,可知定理成立.
证毕。
乘法逆元
可以用扩欧和费马小定理两种方式
代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=20001000;
ll n,p;
ll f[N],ni[N],ci[N];//jie存阶层,ni存逆元,ci存P-2次方;
ll fang(ll a,ll b)
{
ll sum=1;
while(b)
{
a%=p;
sum%=p;
if(b&1) sum=(sum%p*(a%p))%p;
b=b>>1;
a=(a%p*(a%p))%p;
}
return sum%p;
}
int main()
{
freopen("invele.in","r",stdin);
freopen("invele.out","w",stdout);
cin>>n>>p;
f[0]=1;
f[1]=1;
for(ll i=2;i<=n;i++)
f[i]=(f[i-1]*i)%p;
ci[n]=fang(f[n],p-2);
for(ll i=n-1;i>=1;i--)
ci[i]=(ci[i+1]*(i+1))%p;
for(ll i=1;i<=n;i++)
{
ni[i]=(ci[i]*f[i-1])%p;
}
for(ll i=1;i<=n;i++)
printf("%lld\n",ni[i]);
return 0;
}
版子请忽略freopen.
下面是扩欧
typedef long long ll;
void exgcd(ll a,ll b,ll &x,ll &y,ll &d)
{
if (!b)
{
d=a;x=1;y=0;
return;
}
exgcd(b,a%b,x,y,d);
ll temp=x;
x=y;
y=temp-(a/b)*y;
}
int main()
{
ll a,b,x,y,d;
cin>>a>>b;
exgcd(a,b,x,y,d);
x=(x%b+b)%b;
cout<<x<<endl;
return 0;
}
代码里输出的x就是逆元的值了.
中国剩余定理
又称中国余数定理或孙子定理
简单来说就是这样
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
⋮
x
≡
a
n
(
m
o
d
m
n
)
\left\{\begin{matrix} x \equiv a_1(mod\ m_1)\\x \equiv a_2(mod\ m_2)\\\vdots\\x \equiv a_n(mod\ m_n) \end{matrix}\right.
⎩⎪⎪⎪⎨⎪⎪⎪⎧x≡a1(mod m1)x≡a2(mod m2)⋮x≡an(mod mn)
对于这样的一个方程组如果任意的两个
m
m
m都互素,则一定有解
所以中国剩余定理就是解但
m
m
m互素的情况
我们尝试来构造这样一组解
设 M = m 1 × m 2 × ⋯ × m n , M i = M m i M = m_1 \times m_2 \times \cdots \times m_n,M_i = \frac{M}{m_i} M=m1×m2×⋯×mn,Mi=miM
M i M_i Mi只有在模 m i m_i mi时不为零,模其他 m m m都是零
由于我们希望在模 m i m_i mi时得到 a i a_i ai所以乘上 a i t i a_it_i aiti
其中 t i t_i ti是 M i M_i Mi在模 m i m_i mi时的逆元
所以最小正整数解就是 x = ∑ i = 1 n a i t i M i x = \sum_{i=1}^{n}a_it_iM_i x=∑i=1naitiMi,通解就是 x + k M x+kM x+kM
如果题目说明了的
m
m
m都是素数则可以用费马小定理
代码
int crt()
{
int ans=0,M=1;
for(int i=1;i<=n;i++)
M*=m[i];
for(int i=1;i<=n;i++)
{
int Mi=M/m[i],invers=ksm(Mi,m[i]-2,m[i]);
ans=(ans+a[i]*invers*Mi)%M;
}
return ans;
}
也可以用扩展欧几里得
inline int crt()
{
int M=1,ans=0;
for(int i=1;i<=n;i++)
M*=m[i];
for(int i=1;i<=n;i++)
{
LL Mi=M/m[i],x,y;
exgcd(Mi,m[i],x,y);
ans=((ans+a[i]*Mi*x)%M+M)%M;
}
return ans;
}
证明中国剩余定理一定有解
我们举这个同余方程为例
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) \left\{\begin{matrix} x \equiv a_1(mod\ m_1)\\x \equiv a_2(mod\ m_2)\\ \end{matrix}\right. {x≡a1(mod m1)x≡a2(mod m2)
假设我们分别解出
{ x 1 = a 1 + k 1 × m 1 x 2 = a 2 + k 2 × m 2 \left\{ \begin{matrix} x_1 = a_1+k_1 \times m_1 \\ x_2 = a_2 + k_2 \times m_2 \end{matrix}\right. {x1=a1+k1×m1x2=a2+k2×m2
因为 x 1 = x 2 x_1 = x_2 x1=x2
所以 a 1 + k 1 × m 1 = a 2 + k 2 × m 2 a_1+k_1\times m_1 = a_2 + k_2 \times m_2 a1+k1×m1=a2+k2×m2
整理得 k 2 × m 2 − k 1 × m 1 = a 1 − a 2 k_2\times m_2 - k_1\times m_1 = a_1-a_2 k2×m2−k1×m1=a1−a2
这就是 a x + b y = d ax+by=d ax+by=d的形式
所以当 g c d ( m 1 , m 2 ) ∣ a 1 − a 2 gcd(m_1,m_2)|a_1-a_2 gcd(m1,m2)∣a1−a2 时一定有解
又因为 m 1 m_1 m1与 m 2 m_2 m2互质
所以 g c d ( m 1 , m 2 ) = 1 gcd(m_1,m_2) = 1 gcd(m1,m2)=1
显然中国剩余定理一定有解
.