积性函数
概念:一个函数 f ( x ) f(x) f(x),满足存在一对 p p p, q q q且 g c d ( p , q ) = 1 gcd(p,q)=1 gcd(p,q)=1,都有 f ( p q ) = f ( p ) f ( q ) f(pq)=f(p)f(q) f(pq)=f(p)f(q);那么这个函数就是积性函数
证明几个例子:
1、 f ( x ) = 1 f(x)=1 f(x)=1
证明 − − − − − − − − − − − − − − − − − − − − − − − − − − − − − 常值函数 f ( p q ) = 1 = 1 × 1 = f ( p ) f ( q ) 证明-----------------------------\\常值函数f(pq)=1=1×1=f(p)f(q) 证明−−−−−−−−−−−−−−−−−−−−−−−−−−−−−常值函数f(pq)=1=1×1=f(p)f(q)
2、 f ( x ) = x f(x)=x f(x)=x
证明 − − − − − − − − − − − − − − − − − − − − − − − − − − − − − f ( p q ) = p q = f ( p ) f ( q ) 证明----------------------------- \\ f(pq)=pq=f(p)f(q) 证明−−−−−−−−−−−−−−−−−−−−−−−−−−−−−f(pq)=pq=f(p)f(q)
3、 f ( x ) = [ x = 1 ] f(x)=[x=1] f(x)=[x=1]
证明 − − − − − − − − − − − − − − − − − − − − − − − − − − − − − 当 x = 1 ,此时 f ( x ) = 1 ,否则 f ( x ) = 0 (一)当 p 或 q 为 1 时, f ( p q ) = f ( q ) 或 f ( p q ) = f ( p ) 即此时, f ( p q ) = f ( p ) f ( q ) (二)当 p 和 q 都不为 1 时, f ( p q ) = 0 , f ( q ) = 0 , f ( p ) = 0 即此时, f ( p q ) = 0 = f ( p ) f ( q ) 证明-----------------------------\\ 当x=1,此时f(x)=1,否则f(x)=0 \\(一)当p或q为1时,f(pq)=f(q)或f(pq)=f(p) \\即此时,f(pq)=f(p)f(q) \\(二)当p和q都不为1时,f(pq)=0,f(q)=0,f(p)=0 \\即此时,f(pq)=0=f(p)f(q) 证明−−−−−−−−−−−−−−−−−−−−−−−−−−−−−当x=1,此时f(x)=1,否则f(x)=0(一)当p或q为1时,f(pq)=f(q)或f(pq)=f(p)即此时,f(pq)=f(p)f(q)(二)当p和q都不为1时,f(pq)=0,f(q)=0,f(p)=0即此时,f(pq)=0=f(p)f(q)
4、 f ( n ) = n ∗ ( 1 − 1 p 1 ) ∗ ( 1 − 1 p 2 ) . . . ( 1 − 1 p i ) f(n)=n*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})...(1-\frac{1}{p_i}) f(n)=n∗(1−p11)∗(1−p21)...(1−pi1) (欧拉函数:1…n中与n互质的数的数量)
证明 − − − − − − − − − − − − − − − − − − − − − − − − − − − 由唯一分解定理 ( p i , q i 表示 ) 质数可得 p = p 1 α 1 p 2 α 2 p 3 α 3 . . . . p k α k q = q 1 α 1 q 2 α 2 q 3 α 3 . . . . q k α k 又 ∵ g c d ( p , q ) = 1 ∴ p i 与 q i 不相等 ∴ q p = p 1 α 1 p 2 α 2 p 3 α 3 . . . . p k α k ∗ q 1 α 1 q 2 α 2 q 3 α 3 . . . . q k α k ∴ f ( q p ) = q p ∗ ( 1 − 1 p 1 ) ∗ ( 1 − 1 p 2 ) . . . ( 1 − 1 p i ) ∗ ( 1 − 1 q 1 ) ∗ ( 1 − 1 q 2 ) . . . ( 1 − 1 q i ) = f ( q ) f ( p ) 证明--------------------------- \\由唯一分解定理(p_i,q_i表示)质数可得\\ p=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}....p_k^{\alpha_k}\\ q=q_1^{\alpha_1}q_2^{\alpha_2}q_3^{\alpha_3}....q_k^{\alpha_k}\\ 又∵gcd(p,q)=1 \\∴p_i与q_i不相等\\ ∴qp=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}....p_k^{\alpha_k}*q_1^{\alpha_1}q_2^{\alpha_2}q_3^{\alpha_3}....q_k^{\alpha_k} \\∴f(qp)=qp*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})...(1-\frac{1}{p_i})*(1-\frac{1}{q_1})*(1-\frac{1}{q_2})...(1-\frac{1}{q_i})=f(q)f(p) 证明−−−−−−−−−−−−−−−−−−−−−−−−−−−由唯一分解定理(pi,qi表示)质数可得p=p1α1p2α2p3α3....pkαkq=q1α1q2α2q3α3....qkαk又∵gcd(p,q)=1∴pi与qi不相等∴qp=p1α1p2α2p3α3....pkαk∗q1α1q2α2q3α3....qkαk∴f(qp)=qp∗(1−p11)∗(1−p21)...(1−pi1)∗(1−q11)∗(1−q21)...(1−qi1)=f(q)f(p)
5、 f ( n ) = n 的正因子的数量 f(n)=n的正因子的数量 f(n)=n的正因子的数量
证明 − − − − − − − − − − − − − − − − − − − − − − − − − − − 由唯一分解定理 ( p i , q i 表示 ) 质数可得 p = p 1 α 1 p 2 α 2 p 3 α 3 . . . . p k α k q = q 1 α 1 q 2 α 2 q 3 α 3 . . . . q k α k 又 ∵ g c d ( p , q ) = 1 ∴ p i 与 q i 不相等 p q 的正因子的数量 = p 的正因子的数量 ∗ q 的正因子的数量(排列组合) 即 f ( p q ) = f ( q ) ∗ f ( p ) 证明--------------------------- \\由唯一分解定理(p_i,q_i表示)质数可得\\ p=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}....p_k^{\alpha_k}\\ q=q_1^{\alpha_1}q_2^{\alpha_2}q_3^{\alpha_3}....q_k^{\alpha_k}\\ 又∵gcd(p,q)=1 \\∴p_i与q_i不相等\\ pq的正因子的数量=p的正因子的数量*q的正因子的数量(排列组合) \\即f(pq)=f(q)*f(p) 证明−−−−−−−−−−−−−−−−−−−−−−−−−−−由唯一分解定理(pi,qi表示)质数可得p=p1α1p2α2p3α3....pkαkq=q1α1q2α2q3α3....qkαk又∵gcd(p,q)=1∴pi与qi不相等pq的正因子的数量=p的正因子的数量∗q的正因子的数量(排列组合)即f(pq)=f(q)∗f(p)
命题:如果 f ( n ) , g ( n ) f(n),g(n) f(n),g(n)为积性函数,则 h ( n ) = f ( n ) ∗ g ( n ) h(n)=f(n)*g(n) h(n)=f(n)∗g(n)也是积性函数
如何计算积性函数?
(1)计算单点积性函数
设 f f f为积性函数,假设 p = p 1 α 1 p 2 α 2 p 3 α 3 . . . . p k α k p=p_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}....p_k^{\alpha_k} p=p1α1p2α2p3α3....pkαk
则 f ( p ) = f ( p 1 α 1 ) f ( p 2 α 2 ) f ( p 3 α 3 ) . . . . f ( p k α k ) f(p)=f(p_1^{\alpha_1})f(p_2^{\alpha_2})f(p_3^{\alpha_3})....f(p_k^{\alpha_k}) f(p)=f(p1α1)f(p2α2)f(p3α3)....f(pkαk)
那么我可以类似质因数分解的方式来求解积性函数,大问题转化为小问题
int get_f(int n)
{
int ans=1;
for(int i=2;i<=n/i;i++)
{
int cnt=0;
while(n%i==0){
cnt++;
n/=i;
}
ans*=f(i,cnt);
}
if(n>1)ans*=f(n,1);
return ans;
}
(2)欧拉筛求一连串的积性函数
题目描述
求正整数 n的所有正因数的个数,q次询问。
输入描述:
第一行一个正整数 q (1≤q≤10e5) 。
第二行到第 q+1行,每行一个正整数 n (1≤n≤10e7)。
输出描述:
对于每个询问,输出一个正整数。两个答案间用空行分隔。
数据很大,直接上唯一分解定理时间复杂度为 O ( q n ) O(q\sqrt{n}) O(qn),OJ评测机稍微不好直接寄 !!!因此直接上直接上欧拉筛筛积性函数,时间复杂度 O ( n ) O(n) O(n)
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e7 + 10;
int f[maxn];
int cnt[maxn];//维护素数数量
int tot;//素数数量
bool not_prime[maxn];//判断是否为素数
int p[maxn];//素数表
int cal_f(int p, int a)//计算p^a有多少个正因子,直接排列组合
{
return a+1;
}
void Eular()
{
f[1] = 1;
for (int i = 2; i <= maxn; i++)
{
if (!not_prime[i])
{
p[++tot] = i;
f[i] = cal_f(i, 1);
cnt[i]=1;//初始的当前素数为1
}
for (int j = 1; j <= tot && i * p[j] <= maxn; j++)
{
not_prime[i * p[j]] = 1;
if (i % p[j] == 0)
{
cnt[i * p[j]] = cnt[i] + 1;
f[i * p[j]] = f[i] / cal_f(p[j], cnt[i]) * cal_f(p[j], cnt[i] + 1);
break;
}
cnt[i * p[j]] = 1;
f[i * p[j]] = f[i]*cal_f(p[j],1);
}
}
}
int main()
{
Eular();
int q;
cin >> q;
while (q--)
{
int n;
cin >> n;
cout<<f[n]<<endl;
}
return 0;
}