1.积性函数和完全积性函数
积性函数:f(ab)=f(a)f(b) 当(a,b)=1 如μ,φ
完全积性函数:f(ab)=f(a)f(b) 如1,id,idk(i的k次幂),e
定义:1(x)=x,e(x)=[x==1],id(x)=x
公式:(1).(求gcd常用)1*μ=e
(2).μ*id=φ
(3).1*φ=1*μ*id=e*id=id
2.线性筛
Trick:积性函数f,g的积h(x)=f(x)g(x)也是积性函数,可以用线性筛处理。
3.莫比乌斯反演
利用1*μ=e,所以若有F=1*f,则f=e*f=μ*1*f=μ*F
Trick1:F(n)=∑n|d f(d),则f(n)=∑n|d μ(d/n)*F(d)
Trick2:求前缀和,数论分块
luoguP1829 [国家集训队]Crash的数字表格 / JZPTAB
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int N=10000010,mod=20101009; 5 int cc,vis[N],pr[N],sm[N];//sum of miu(i)*i*i 6 ll n,m,ans; 7 inline void init() 8 { 9 vis[1]=1;sm[1]=1; 10 for(int i=2;i<N;i++) 11 { 12 if(!vis[i])pr[++cc]=i,sm[i]=-1; 13 for(int j=1;j<=cc&&1ll*i*pr[j]<N;j++) 14 { 15 vis[i*pr[j]]=1; 16 if(i%pr[j]==0){sm[i*pr[j]]=0;break;} 17 sm[i*pr[j]]=-sm[i]; 18 } 19 } 20 for(int i=1;i<N;i++)sm[i]=(sm[i-1]+1ll*i*i*sm[i])%mod; 21 } 22 inline ll S(ll x){x%=mod;return x*(x+1)%mod*(mod+1)/2%mod;} 23 inline ll F(int x,int y) 24 { 25 ll r=0; 26 for(int i=1,j;i<=x;i=j+1) 27 { 28 j=min(x/(x/i),y/(y/i)); 29 r+=S(x/i)*S(y/i)%mod*(sm[j]-sm[i-1])%mod; 30 } 31 return r; 32 } 33 int main() 34 { 35 scanf("%lld%lld",&n,&m);init(); 36 if(n>m)swap(n,m); 37 for(int i=1,j;i<=n;i=j+1) 38 { 39 j=min(n/(n/i),m/(m/i)); 40 ans+=F(n/i,m/i)*(S(j)-S(i-1))%mod; 41 } 42 printf("%d\n",(ans%mod+mod)%mod); 43 return 0; 44 }
启发:类似的问题通过固定一个元的变化观察式子剩下部分变化的规律(如是否有大量连续相同值)。
基础习题:bzoj 2154 bzoj2005 bzoj1101 bzoj 2440
较难的题:bzoj 3529 bzoj 3309 bzoj 3561
模型不明显的题:bzoj 3481 #346. 【Jiangsu Training Contest 8】01 串
***注意复习 估计现在一个都不会了
***注意讨论不同的情况
4.狄利克雷卷积 f*g=∑d|n f(d)g(n/d)
bzoj 4407
5.二项式反演
(1).和容斥类似,f(n)=∑C(n,i)gi等价于g(n)=∑(-1)n-iC(n,i)f(i)
(2).少见的:f(k)=∑C(i,k)gi (k<=i<=n)等价于g(k)=∑(-1)i-kC(i,k)f(i) (k<=i<=n)
目前知道的用途:对于不明显的容斥,发现组合数关系可以确定答案一定可以反演回来
6.斯特林数
7.最值反演
8.拉格朗日反演(zblzblzbl不会啦)
9.牛顿迭代(After WC)
10.多项式相关(After WC)
11.生成函数(After WC)
Trick:五边形数计算划分数O(nsqrt(n))
12.原根
13.指标 BSGS 即求解 ax=b(mod c)
利用分块做到O(sqrt(n))或O(sqrt(n)log(n))
14.二次剩余 Cipolla 求解x2=a(mod b)
16.CRT
17.Lucas
18.Miller-Rabin
19.Pollard-Rho
20.线性代数
21.杜教筛
22.min25筛
23.群论