数论–积性函数
-
定义:对于任意一对互质的正整数p,q, 都有 f(p*q)=f§*f(q)
-
函数举例:
- f(n)=1
- f(n)=n
- 欧拉函数:f[n]=n* (1- 1/p1) *(1- 1/p2) *…(1- 1/pk )
- f[n] = n的正因子数量: 若n=p^a1* p^a2 …p^ak , 则 f[n] = (a1+1) (a2+1)*…(ak+1)
-
一些性质 :
- 若 f(n), g(n)是积性函数,则 f(n)*g(n)也是积性函数
- 若 f(n) 是积性函数,则 g(n)=E(d|n) f(d) 也是积性函数
-
用法
-
假设 n=p^a1* p^a2 *…p^ak, 则 f(n) = f(p1^a1) *f(p2^a2) *…f(pk^ak),则可以利用质因数分解求f(n)
// O(sqrt(n)) 求f(n) ll get_f(ll n){ ll ans=1; for(int i=2;i*i<=n;i++){ int cnt=0; while(n%i==0) cnt++,n/=i; ans*=f(i,cnt); // f(i,cnt)==f(i^cnt) } if(n>1) ans*=f(n,1); return ans; } // O(nlogn) 求f(1)到f(n) 欧拉筛 void get_allf(int n){ f[1]=cal_f(1,1); for(int i=2;i<=n;i++){ if(!not_prime[i]) p[++tot]=i,f[i]=cal_f(i,1); for(int t=1;t<=tot&&i*p[t]<=n;t++){ not_prime[i*p[t]]=1; if(i%p[t]==0){ cnt[i*p[t]]=cnt[i]+1; f[i*p[t]]=f[i]/cal_f(p[t],cnt[i])*cal_f(p[t],cnt[i]+1); break; } cnt[i*p[t]]=1; f[i*p[t]]=f[i]*cal_f(p[t],1); } } }
-
min25筛
// 优于欧拉筛
-