清北学堂-day2
首先
我声明一下
上一篇博客我写错了
我懒得删了,你就不要再看那一篇了
1°:
逆元
gcd(a,m)=1
a*b=1(mod m)
b=a^(-1) (mod m)
a^(p-1)=1 (mod p)
a与a^(p-2) mod p 下互为逆元
a与a^(φ(m)-1) mod m 互为逆元
2°
线性求逆元
int[i] mod p;
p = k * i + r;
0 = k * i + r ( mod p )
* i ^ ( - 1 ) * r ^ ( - 1 )
0 = k * r ^ ( - 1) + i ^ ( - 1 ) ( mod p )
i ^ ( - 1 ) = - k * r ^ ( - 1 )
i ^ ( - 1 ) = -[ p / i ] * inv [ r ]
3°
Exgcd
给定 a , b
知道 gcd ( a , b ) = g
求 x , y
使 : x * a + y * b = g
1 void exgcd(long long a,long long b,long long &x,long long &y){ 2 if(b==0){ 3 x=1; 4 y=0; 5 return; 6 } 7 exgcd(b,a%b,x,y); 8 long long f=x; 9 x=y; 10 y=f-y*(a/b); 11 }
算了,推导过程不便表述
4°
中国剩余定理
正统做法:
1 int intchina(int r) 2 { 3 int Mi,x,y,d,ans=0;M=1; 4 for(int i=1;i<=r;i++) M*=m[i]; 5 for(int i=1;i<=r;i++){ 6 M[i]=M/m[i]; 7 exgcd(Mi,m[i],d,x,y); 8 ans=(ans+Mi*x*a[i])%M; 9 } 10 return (ans+M)%M; 11 }
x = b_1 ( mod m_1)
x = b_2 ( mod m_2 )
x = k_1 * m_1 + b_1 = k_2 * m_2 + b_2
k_1 * m_1 - k_2 *m_2 = b_2 - b_1
若 gcd ( m_1 , m_2 ) | b_2 - b_1 则有解
大数翻倍法 :
{
x % m_1 = b_1
x % m_2 = b_2
}
设m_1>m_2
b_1 b_1 + m_1 b_1 + 2 * m_1 b_1 + 3 * m_1 ...........
c_1 c_2 c_3 .........c_n
if c_1 % m_2 = b_2 -> x % lcm ( m_1 , m_2 ) = b + k * m_1
O( min ( m_1 , m_2 ) ) n越小速度越慢
1 #include<algorithm> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 inline long long py(long long a,long long b) 6 { 7 return a*b/__gcd(a,b); 8 } 9 10 int main() 11 { 12 long long n,a[13],b[13],c,ans; 13 ios_base::sync_with_stdio(false); 14 cout.tie(NULL); 15 cin>>n; 16 for(int i=1;i<=n;i++) 17 { 18 cin>>a[i]>>b[i]; 19 } 20 c=a[1]; 21 ans=b[1]; 22 for(int i=2;i<=n;i++) 23 { 24 while(ans%a[i]!=b[i]) ans+=c; 25 c=py(c,a[i]); 26 } 27 cout<<ans; 28 return 0; 29 }
5°
积性函数:
若 gcd ( a ,b ) = 1 且f ( a , b )=f (a ) * f ( b ) 则为积性函数
若取消该互素条件,则为完全积性函数
6°
狄利克雷卷积:
定义:
( f * g ) ( n ) = Σ f ( d ) * g ( n / d ) d | n
f * g =g * f
( f * g) * h = f * ( h * g )
( f + g ) * h = f * h +g * h
I ( n ) = 1
mu * I = epsilon ( epsilon ( n ) = [ n == 1 ])
phi * I = id ( id( n ) == n)
mu * id = phi
7°
莫比乌斯反演:
若
g ( n ) = Σ f ( d )
则
f ( n ) = Σ mu ( d ) * g ( n / d )
1:增加求和号
2:交换求和顺序
3:反演