【ACM数论】积性函数

积性函数

概念:一个函数 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,此时fx=1,否则fx=0(一)当pq1时,f(pq)=f(q)f(pq)=f(p)即此时,f(pq)=f(p)f(q)(二)当pq都不为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(1p11)(1p21)...(1pi1) (欧拉函数: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αkgcdpq=1piqi不相等qp=p1α1p2α2p3α3....pkαkq1α1q2α2q3α3....qkαkf(qp)=qp(1p11)(1p21)...(1pi1)(1q11)(1q21)...(1qi1)=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αkgcdpq=1piqi不相等pq的正因子的数量=p的正因子的数量q的正因子的数量(排列组合)fpq=fqf(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;
}
  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值