积性函数

原文:http://blog.csdn.net/skywalkert/article/details/50500009
以下是本人整理~

常用公式:

d|nφ(n)=nφ(n)=nd|n,d<nφ(d)
ni=1[gcd(n,i)=1]i=nφ(n)+[n=1]2
[n=1]=d|nμ(d)
n=d|nφ(d)

S(n)=ni=1ϕ(i)
S(n)=n(n+1)2ni=2S(ni)


S(n)=ni=1iϕ(i)
S(n)=n(n+1)(2n+1)6ni=2iS(ni)


S(n)=ni=1μ(i)
S(n)=1ni=2S(ni)


S(n)=ni=1iμ(i)
S(n)=1ni=2S(ni)

一些函数定义:
元函数 e(n)=[n=1] ,狄利克雷卷积的乘法单位元,完全积性。
恒等函数 I(n)=1 ,完全积性。
单位函数 id(n)=n ,完全积性。
幂函数 idk(n)=nk ,完全积性。

积性函数的定义

  1.若 f(n) 的定义域为正整数域,值域为复数,即 f:Z+C ,则称 f(n) 数论函数 I 为数论函数集合)。
  2.若f(n)为数论函数,且 f(1)=1 ,对于互质的正整数 p,q f(pq)=f(p)f(q) ,则称其为积性函数
  3.若 f(n) 为积性函数,且对于任意正整数 p,q 都有 f(pq)=f(p)f(q) ,则称其为完全积性函数

积性函数的性质与例子

     σk(n)=d|ndk ,表示n的约数的k次幂和
      特殊:约数个数 k=0 ,约数和 k=1
  
    欧拉函数:
     φ(n)=ni=1[(n,i)=1]=ki=1(11pi)
     d|nφ(n)=nφ(n)=nd|n,d<nφ(d)
    表示不大于n且与n互质的正整数个数(n>2时φ(n)为偶数)
   
     ni=1[gcd(n,i)=1]i=nφ(n)+[n=1]2
    表示不大于n且与n互质的正整数总和

    莫比乌斯函数:
     μ(n)={(1)t   n=ti=1pi0     

    莫比乌斯经典公式:
     [n=1]=d|nμ(d)   排列组合后二项式定理转换即可证明
     n=d|nφ(d)     将 in(1in) 化为最简分数统计个数即可证明

    若 f(n) 为积性函数,对于 n=ti=1pkii
    则: f(n)=ti=1f(pkii)

    若 f(n) 完全积性函数,对于 n=ti=1pkii
    则: f(n)=ti=1f(pi)ki

狄利克雷卷积与莫比乌斯反演

    一、
    数论函数 f g狄利克雷卷积定义为 (fg)(n)=d|nf(d)g(nd)
    狄利克雷卷积满足交换律、结合律,对加法满足分配律。
    存在单位元函数 e(n)=[n=1] 使得 fe=f=ef
    若 f g为积性函数则 fg 也为积性函数。

    二、
    狄利克雷卷积的一个常用技巧是对于积性函数 f 与恒等函数I的卷积的处理。比如:
    已知 n=ti=1pkii
    若  g(n)=d|nf(d)
    则  g(n)=ti=1kij=0f(pji)

    三、
    莫比乌斯反演也是对于 g(n)=d|nf(d) 的讨论。
    ☆但是不要求 f 是积性函数☆(适用于已知g(n) f(n) 的情况)
     f(n)=d|ng(d)μ(nd)
    证明:
    ∵ Iμ=e
    ∴ gμ=fIμ=fe=f
    
    欧拉函数和莫比乌斯函数之间的关系
    ∵ d|nφ(d)=id(n)
    ∴ φ(n)=d|nμ(d)nd
    ∴ φ(n)n=d|nμ(d)d

杜教筛

  一个简单的例子:
    求前n个正整数的约数之和,即 ni=1σ(i) 其中 n1012
  推导:
     ni=1σ(i)=ni=1nj=1[j|i]j=ni=1inj=1[i|j]=ni=1ini
  当 in ni 只有 n 个值
  当 in
  ∵ nin
  ∴ ni 只有 n 个值
  对于固定的 ni i 的取值是一段连续的区间,是[nni+1+1,nni]

  练习:求前n个正整数的约数个数之和
   ni=1ini=ni=1ni(ni+1)2 (一个常见的表达形式)

  另一个例子:
  求前n个正整数的欧拉函数之和,即 ni=1φ(i) ,其中 n1011
  
  推导:
  我们利用 d|nφ(n)=n 来化简。
  它的另一个形式: φ(n)=nd|n,d<nφ(d)
  记 ϕ(n)=ni=1φ(i)
  那么:
  

ϕ(n)=i=1nφ(i)=i=1n[id|i,d<iφ(d)]=n(n+1)2i=2nd|i,d<iφ(d)=n(n+1)2i=2nd[d|i]φ(d)=n(n+1)2id=2nd=1nidφ(d)=n(n+1)2i=2nd=1niφ(d)=n(n+1)2i=2nϕ(ni)

  
  其中
i=2nd[d|i]φ(d)=id=2nd=1nidφ(d)

  它的思想所在就是:d的条件是要能整除i,无法方便算出。于是我们便枚举 di 的值,这样这些值就是连续的一坨一坨的了。

  时间复杂度证明:
  这里写图片描述

  小总结:
  如果能通过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另一个函数也易计算,则可以简化计算过程。例如上题就是利用了φ∗I=id的性质,但一定注意,不是所有的这一类题都只用配个恒等函数I就可以轻松完事的,有时需要更细致的观察。
  先根据要求的函数的一些其他表达式进行简化,将简化出来的式子或原式整体感知一下(明白它在求什么),尝试从其他方式考虑(目标就是降低复杂度,那么就要观察枚举的那些数那些比较小,那些数比较有特性之类的)

  杜教筛通式:
  我们要求的是 S(n)=ni1f(i) ,其中 fI
  假设 gI g(1)0 那么
  

i=1n(fg)(i)=i=1nd|ig(d)f(id)=i=1ng(d)1in,d|if(id)=d=1ng(d)i=1ndf(i)=d=1ng(d)S(nd)

  即
  
i=1n(fg)(i)=d=1ng(d)S(nd)

  ∴
g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)

  如果我们能知道 g fg,那么我们就能快速知道 S(n) ,问题就能愉快地解决啦~

  大白话口胡:
  上面的函数 g 是我们xjb选的一个数论函数。若ni=1(fg)(i)g(1)0那么:
  

g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)

  假设 g(1)Ani=1(fg)(i)=B
   AS(n)=Bni=2g(i)S(ni)
  (能求的前提是g(i)可以快速知道的哦~)

一坨题

 
  1.求前n个正整数的约数之和。 ni=1σ1(i) √见上
  
  2.求前n个正整数的约数个数之和。 ni=1σ0(i)
  
  3.求前n个正整数的欧拉函数之和。 ni=1φ(i) √见上
  
  4.求前n个正整数的μ值之和。 ni=1μ(i)
  
  5.令 A(n)=ni=1i(n,i),F(n)=ni=1A(i) ,求 F(n)
  
  6.若 n=ti=1pkii rad(n)=ti=1pi
  求 ni=1d|nrad(d)φ(drad(d))

  7.求 ni=1nj=1lcm(i,j)

  8.求 ni=1nj=1gcd(i,j)

  9.求 S(n)=ni=1iϕ(i)

  10.求 ni=1ij=1lcm(i,j)i

  11.求 ni=1mj=1lcm(i,j)

一坨解法

  2.求前n个正整数的约数个数之和。 ni=1σ0(i)
    

i=1nσ0(i)=i=1nd=1n[d|n]=d=1nnd

  
  4.求前n个正整数的μ值之和。 S(n)=ni=1μ(i)
    
1=i=1n[i=1]=i=1nd|iμ(d)=d=1ni=1niμ(i)=i=1nS(ni)

    ∴ S(n)=1ni=2S(ni)
  7.求 ni=1nj=1lcm(i,j)
  
i=1nj=1nlcm(i,j)=i=1nj=1nijgcd(i,j)=d=1ndi=1ndij=1ndj[gcd(i,j)==1]

  ∵
i=1ni[gcd(i,n)==1]=nϕ(n)2

  ∴
=d=1ndi=1ndi2ϕ(i)

  令
S(n)=i=1ni2ϕ(i)

  
g(n)=n2ϕ(n)

  ∵
n=d|nϕ(d)

  ∴
(n(n+1)2)2=i=1nd|iϕ(d)i2=i=1nd|ig(d)(id)2=i=1nd=1nig(d)i2

  ∴
S(n)=(n(n+1)2)2i=2ni2S(ni)

  8.求 ni=1nj=1gcd(i,j)
  

i=1nj=1ngcd(i,j)=i=1nj=1nd|gcd(i,j)ϕ(d)=i=1nj=1nd|i,d|jϕ(d)=d=1ni=1ndj=1ndϕ(d)=d=1nϕ(d)ndnd

  转换为问题3

  9.求 S(n)=ni=1iϕ(i)
  

n(n+1)(2n+1)6=i=1ni2=i=1nd|idϕ(d)id=i=1nid=1nidϕ(d)=i=1niS(ni)=S(n)+i=2niS(ni)

  10.求 ni=1ij=1lcm(i,j)i
  

i=1nj=1ilcm(i,j)i=i=1nj=1ijgcd(i,j)=d=1ni=1ndj=1ij[gcd(i,j)=1]=d=1ni=1ndiϕ(i)2=i=1niϕ(i)2ni

  11.求 ni=1mj=1lcm(i,j)
  不妨设 nm
  

i=1nj=1mlcm(i,j)=d=1ndi=1ndj=1mdij[gcd(i,j)=1]

  令 F(x,y)=xi=1yj=1ij[gcd(i,j)=1]
  ∴
=d=1ndF(ndmd)

  分析 F(x,y)
  
F(x,y)=i=1xj=1yij[gcd(i,j)=1]=i=1xj=1yijd|gcd(i,j)μ(d)=d=1xμ(d)d2i=1xdij=1ydj=d=1xμ(d)d2xd(xd+1)yd(yd+1)4

  代入原式:
  
=d=1nddd=1ndμ(dd)dd2nddd(nddd+1)mddd(mddd+1)4

  预处理以后分块套分块。也可以不预处理,之间分块套分块套杜教筛

//问题4----51nod1244
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;
typedef long long ll;
const int N=100100;
int p[N],v[N],mu[N],tot;
ll l,r,ans,sum[N];
map<ll,ll> mp;

ll gao(ll n){
    if (n<N) return sum[n];
    if (mp.find(n)!=mp.end()) return mp[n];
    ll res=1,i,nx;
    for (i=2;i<=n;i=nx+1){
        nx=n/(n/i);
        res=res-(nx-i+1)*gao(n/i);
    }
    return mp[n]=res;
}

void pre(){
    for (int i=2;i<N;i++){
        if (!v[i]) p[++tot]=i,mu[i]=-1;
        for (int j=1;j<=tot && i*p[j]<N;j++){
            v[i*p[j]]=1;
            if (i%p[j]==0) break;
            mu[i*p[j]]=-mu[i];
        }
    }
    mu[1]=1;
    for (int i=1;i<N;i++)
        sum[i]+=sum[i-1]+mu[i];
}

int main(){
    freopen("d.in","r",stdin);
    scanf("%lld%lld",&l,&r);pre();
    printf("%lld\n",gao(r)-gao(l-1));
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值