ACM 数论(一些定理及应用)

常用定理

1. 欧拉定理(费马-欧拉定理)

n , a n, a n,a为正整数且 n , a n, a n,a互素,则有如下公式: a φ ( n ) ≡ 1 a^{\varphi(n)} \equiv 1 aφ(n)1 (mod n)
含义 a φ ( n ) a^{\varphi(n)} aφ(n)与1在模n下 同余,其中 φ ( n ) \varphi(n) φ(n)为欧拉函数,代表小于或等于 n n n的正整数中与 n n n互质的数的数目。
举个栗子: a = 3 , n = 5 a=3, n=5 a=3,n=5,小于5的正整数中与5互质的数为1,2,3,4,所以 φ ( 5 ) = 4 \varphi(5) = 4 φ(5)=4,那么 3 4 ≡ 1 3^{4} \equiv 1 341 mode 5,成立。
应用:本定理可大程度地简化幂的模运算。 [ 1 ] ^{[1]} [1]比如计算 7 222 7^{222} 7222的个位数时,可将此命题视为求 7 222 7^{222} 7222被10除的余数。因为7和10互质,而 φ ( 10 ) = 4 \varphi(10) = 4 φ(10)=4,所以 7 222 = 7 4 ⋅ 55 + 2 = ( 7 4 ) 55 ⋅ 7 2 ≡ 1 55 ⋅ 7 2 ≡ 49 ≡ 9 ( m o d 10 ) 7^{{222}}=7^{{4\cdot 55+2}}=(7^{4})^{{55}}\cdot 7^{2}\equiv 1^{{55}}\cdot 7^{2}\equiv 49\equiv 9{\pmod {10}} 7222=7455+2=(74)557215572499(mod10)

2. 费马小定理

假如a是一个整数,p是一个质数,那么 a p − a a^{p}-a apa是p的倍数,可以表示为 a p ≡ a ( m o d p ) a^{p}\equiv a{\pmod {p}} apa(modp)。如果a不是p的倍数,这个定理也可以写成 a p − 1 ≡ 1 a^{p-1} \equiv 1 ap11 (mod p)。
应用:计算 2 100 2^{{100}} 2100除以13的余数:
2 100 ≡ 2 12 × 8 + 4 ( m o d 13 ) ≡ ( 2 12 ) 8 ⋅ 2 4 ( m o d 13 ) ≡ 1 8 ⋅ 16 ( m o d 13 ) ≡ 16 ( m o d 13 ) ≡ 3 ( m o d 13 ) 2^{{100}}\equiv 2^{{12\times 8+4}}{\pmod {13}} \equiv (2^{{12}})^{8}\cdot 2^{4}{\pmod {13}} \equiv 1^{8}\cdot 16{\pmod {13}} \equiv 16{\pmod {13}} \equiv 3{\pmod {13}} 2100212×8+4(mod13)(212)824(mod13)1816(mod13)16(mod13)3(mod13)

3.威尔逊定理

当且仅当p为质数时: ( p − 1 ) ! ≡ − 1 (p-1)! \equiv -1 (p1)!1 mod p
含义:给出了判定一个自然数是否为质数的充分必要条件。但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大。

4.卢卡斯定理

A、B是非负整数, p p p是质数。A、B写成p进制: A = a [ n ] a [ n − 1 ] . . . a [ 0 ] , B = b [ n ] b [ n − 1 ] . . . b [ 0 ] A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0] A=a[n]a[n1]...a[0]B=b[n]b[n1]...b[0]。则组合数 C ( A , B ) C(A,B) C(A,B) C ( a [ n ] , b [ n ] ) ∗ C ( a [ n − 1 ] , b [ n − 1 ] ) ∗ . . . ∗ C ( a [ 0 ] , b [ 0 ] ) C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) C(a[n],b[n])C(a[n1],b[n1])...C(a[0],b[0]) mod p同余,即
L u c a s ( n , m , p ) = c ( n % p , m % p ) ∗ L u c a s ( n / p , m / p , p ) Lucas(n,m,p)=c(n\%p, m\%p)*Lucas(n/p,m/p,p) Lucas(n,m,p)=c(n%p,m%p)Lucas(n/p,m/p,p)
应用:(一道模板题)用于处理组合数取模, C ( n , m ) C(n,m) C(n,m) mod p,其中p为素数。

附上模板题AC代码:

#include<bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
ll a[N];  //代表N的阶乘mod p后的结果 
int p;
ll pow(ll y, int z, int p) {
	y %= p;
	ll ans = 1;
	for(int i=z; i; i>>=1, y=y*y%p)  //快速幂 
		if(i&1)  //奇数 
			ans = ans*y%p;
	return ans;
}

ll C(ll n, ll m) {
	if(m>n)	return 0;
	return ((a[n]*pow(a[m], p-2, p))%p * pow(a[n-m], p-2, p)%p);  //逆元,所以是乘法 
}

ll Lucas(ll n, ll m) {
	if(!m)	return 1;
	return C(n%p, m%p) * Lucas(n/p, m/p)%p;
}

int main() {
	int T, n, m;
	cin>>T; 
	while(T--) {
		cin>>n>>m>>p; 
		a[0] = 1;
		for(int i=1; i<=p; i++)
			a[i] = (a[i-1]*i)%p;
		cout<<Lucas(n+m, n)<<endl;
	}
	return 0; 
}

参考资料:
[1] https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%AE%9A%E7%90%86_(%E6%95%B0%E8%AE%BA)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值