今天,$zutter$终于下定决心去学了数论,然后
从基础说起
-
gcd
这个..感性理解一下就好了啊
gcd(int a,int b) { if(b==0) return a; return(b,a%b); }
证明:
-
exgcd
扩展欧几里得算法,用于在已知(a,b)时求解(x,y) 使 a*x+b*y=c (c | gcd(a,b))
int ex_gcd(int a,int b,int &x,int &y) { int ret, tmp; if(! b) { x = 1, y = 0; return a; } ret=ex_gcd(b, a % b, x, y); tmp= ; x=y; y=tmp-a/b*y; return ret; }
证明:
又因为
所以任意都可为解
-
逆元
当时,称x为a在%p意义下的逆元,记作
解法:
-
- 扩展欧几里得
-
- 费马小定理
且
- 费马小定理
-
- 线性求逆元
- 线性求逆元
-
中国剩余定理 Chinese Rimainder Theorem
解法:
-
排列
求%P
-
- $C_n^m=C_{n-1}^{m-1}+C_{n-1}^{m}$
- m,n小于p时可以用O(n)的时间预处理,用O(1) 求值
方法
2.当m,n过大p过小,m,n>p 时
-
- 卢卡斯定理
求c的公式
递归中每次当 m,n<p 时调用1中公式即可。
-
二项式定理
$(x+y)^n$ 中 $x^ty^{n-t}$ 的系数为 $C_n^t$