数学知识
斐波那契数
1:
2:
3:
证明:
4:
中国剩余定理
设
使得:
扩展中国剩余定理
#include<bits/stdc++.h>
using namespace std ;
#define LL long long
#define Int __int128
int n ;
Int exgcd(Int a , Int b , Int &x , Int &y){
if(b == 0){
x = 1 , y = 0 ;
return a ;
}
Int d = exgcd(b , a%b , y , x) ;
y -= a / b * x ;
return d ;
}
Int excrt(){ // 扩展中国剩余定理。(将两个同余方程化成一个同余方程)
scanf("%d", &n) ;
LL x , y ;
// 这里将形如 x ≡ a mod(m) 化成 x = mk + a , k为任意整数。
Int k1 , k2 , m1 = 1 , m2 , a1 = 0 , a2 ;
for(int i = 1 ; i <= n ; i++){
scanf("%lld%lld", &x , &y) ; // 输出第二个同余方程。
m2 = (Int)x , a2 = (Int)y ;
Int d = exgcd(m1 , m2 , k1 , k2) ; // 用扩展欧几里得算法求线性同余方程的解,并返回m1,m2最大公因数。
if((a2-a1) % d) return -1 ; // 判断不定方程是否有整数解。
k1 *= (a2-a1) / d ; // 将不定方程两边乘上(a2-a1)/ d ,变成 m1k1+m2k2=a2-a1。
k1 = (k1 % (m2/d) + (m2/d)) % (m2/d) ; // 将k1化为不定方程最小正整数解。
a1 += m1 * k1 ;
m1 = m1 / d * m2 ;
}
return (a1 % m1 + m1) % m1 ; // 将ans化为不定方程最小正整数解。
}
int main(){
printf("%lld\n", (LL)excrt()) ;
return 0 ;
}
二项式定理:
最大公约数
卢卡斯定理:
设
则
证明
O(n)求乘法逆元
#include<bits/stdc++.h>
using namespace std ;
#define LL long long
const int N = 3e6 + 10 ;
int n , p ;
LL ny[N] ;
int main(){
scanf("%d%d", &n , &p) ;
for(int i = 1 ; i <= n ; i++){
ny[i] = (p - p/i) * ny[p%i] % p ;
if(i == 1) ny[i] = 1 ;
printf("%lld\n", ny[i]) ;
}
return 0 ;
}