zoukankan      html  css  js  c++  java
  • 莫比乌斯反演学习笔记

    资料:https://blog.csdn.net/skywalkert/article/details/50500009

       https://blog.csdn.net/acdreamers/article/details/8542292

    概念:

      数论函数:若 $f(n)$ 的定义域为正整数域,值域为复数域,则称 (f(n)) 为数论函数

      积性函数:若 (f(n)) 是数论函数,且 (f(1) = 1),对于互质的正整数 (p,q) 有 (f(p cdot q) = f(p) cdot f(q)),则称其为积性函数。若 (f(n)) 为积性函数,且对于任意正整数 (p,q) 都有 (f(p cdot q) = f(p) cdot f(q)),则称其为完全积性函数。

      狄利克雷卷积:对于数论函数 (f) 和 (g) 的狄利克雷卷积为 ((f*g)(n) = sum _{d|n} f(d) cdot g(frac{n}{d}))。狄利克雷卷积满足交换律、结合律,对加法满足分配律 (^{alpha})。存在单位元函数 (e(n) = [n=1]) 使得 (f*e = e*f = f)。若 (f) 和 (g) 为积性函数,则 (f*g) 也是积性函数 (^{eta})

      (diamondsuit)简单证明:

      (alpha .)分配律: $f_1 * g + f_2 * g = sum _{d|n} f_1(d) g(frac{n}{d}) + sum _{d|n} f_2(d) g(frac{n}{d}) = sum _{d|n} (f_1(d) + f_2(d)) g(frac{n}{d}) = (f_1 + f_2) * g$

      (eta .) 设积性函数 (f, g) 和 (h=f*g ),对于任意一对互质正整数 (a, b),有

      $h(a)=sum _{d_1|a}f(d_1)g(frac{a}{d_1})$

      $h(b)=sum _{d_2|b}f(d_2)g(frac{b}{d_2})$

      $h(a)h(b)=sum _{d_1|a并d_2|b}f(d_1)g(frac{a}{d_1})f(d_2)g(frac{b}{d_2})$

    由于 $gcd(a,b)=1$,故 $gcd(d_1,d_2)=1,gcd(frac{a}{d_1},frac{b}{d_2})=1$。所以有,$h(a)h(b)=sum_{(d_{1}d_{2})|(ab)}f(d_{1}d_{2})g(frac{ab}{d_{1}d_{2}})$。令 $d=d_{1}d_{2}$,则有 $h(a)h(b)=sum_{d|(ab)}f(d)g(frac{ab}{d})=h(ab)$ 。

      故 $ h=f*g $ 是积性函数。

    函数和性质:

      一、常用积性函数:

        1、莫比乌斯函数 $mu(n)$,在狄利克雷卷积中与恒等函数互为逆元。

      $mu(n)=egin{cases} 1, n=1\(-1)^k, n=p_{1}p_{2}...p_{k}\0,otherend{cases}$

        2、恒等函数 $I(n)=1$,完全积性。

        3、除数函数 $sigma _k(n) = sum _{d|n} d^k $,表示 $n$ 的约数的 $k$ 次幂和。

        4、约数个数函数 $sigma_0(n) =sum _{d|n}1$,表示 $n$ 的约数个数。

        5、约数和函数 $sigma _1(n) = sum _{d|n} d $,表示 $n$ 的约数和。

        6、欧拉函数 $varphi (n)=sum_{i=1}^{n}[gcd(n,i)=1]$,表示不大于 $n$ 且与 $n$ 互质的正整数个数。另外有$sum_{i=1}^{n}[gcd(n,i)=1] cdot i = frac{n cdot varphi(n)+[n=1]}{2}$,且对于正整数 $n>2$ 来说 $varphi(n) $ 是偶数。

        7、元函数 $e(n)=[n=1]$,狄利克雷卷积的乘法单位元,完全积性。

        8、单位函数 $id(n)=n$,完全积性。

        9、幂函数 $id^{k}(n)=n^{k}$,完全积性。

      二、关于莫比乌斯函数和欧拉函数的两个经典公式

        1、$[n=1]=sum _{d|n} mu(d) $

        证明:

    应用:

      一、求满足$x in (a_1,b_1), y in (a_2,b_2)$ 且 $gcd(x,y) = k$ 的 $(x,y)$ 的对数。

    例题1、BZOJ2818

    题意:

      给定整数 $N$,求 $1 le x,y le N$ 且 $gcd(x,y)$ 为素数的数对(x,y)有多少对。

    思路:

      设 $f(n)$ 为 $[1,N]$ 中满足 $gcd(x,y)=n$ 的 $(x,y)$ 对数,令 $F(n) = sum _{n|d} f(d)$,则 $F(n)$ 代表满足 $n|x$ 并且 $n|y$ 的 $(x,y)$ 的对数。易知 $F(n)=(lfloor frac{N}{n} floor)^2 $,于是我们有 $f(n)=sum _{n|d} mu(frac{d}{n})F(d)=sum _{n|d} mu(frac{d}{n})(N/d)^2$,且求 $[1,N]$ 范围中的 $f(n)$ 可转换成求 $[1,N/n]$ 中的 $f(1)$,此时 $f(1) = sum_{d=1}^{N/n} mu(d) (N/n/d)^2$。

      于是,这道题的一种做法就是:先预处理出莫比乌斯函数的前缀和。然后枚举 $[1,N]$ 中的所有质数 $p$,求 $f(1)=sum_{d=1}^{N/p} mu(d) underline{(N/p/d)^2}$,后面的划下划线的部分可以用数论分块优化到 $O(sqrt n)$,前面的莫比乌斯函数用前缀和计算。所有 $f(1)$ 加起来就能得出答案。

    AC代码:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long LL;
     5 const int MAXN=1e7+5;
     6 bool check[MAXN];
     7 int prime[MAXN],tot;
     8 int mu[MAXN];
     9 LL pre[MAXN];
    10 
    11 void init(){
    12     mu[1]=1;
    13     for(int i=2;i<MAXN;i++){
    14         if(!check[i]){
    15             prime[tot++]=i;
    16             mu[i]=-1;
    17         }
    18         for(int j=0;j<tot;j++){
    19             if(1LL*i*prime[j]>=MAXN) break;
    20             check[i*prime[j]]=true;
    21             if(i%prime[j]==0){
    22                 mu[i*prime[j]]=0;
    23                 break;
    24             }
    25             else
    26                 mu[i*prime[j]]=-mu[i];
    27         }
    28     }
    29     for(int i=1;i<MAXN;i++)
    30         pre[i]=pre[i-1]+mu[i];
    31 }
    32 
    33 
    34 int main(){
    35     init();
    36     LL n;
    37     scanf("%lld",&n);
    38     LL ans=0;
    39     for(int i=0;i<tot;i++){
    40         LL p=prime[i];
    41         if(p>n) break;
    42 //数论分块
    43         LL l=1,r;
    44         while(l<=n/p){
    45             r=n/p/(n/p/l);
    46             ans+=(pre[r]-pre[l-1])*(n/l/p)*(n/l/p);
    47             l=r+1;
    48         }
    49 //*************************************************
    50     }
    51     printf("%lld
    ",ans);
    52 
    53     return 0;
    54 }
    View Code

     

    “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
  • 相关阅读:
    气象数据集数据和相关源码
    农产品质量追溯系统/质量安全追溯系统
    Nutch2.x 演示抓取第一个网站
    Nutch的配置以及动态网站的抓取
    leach-matlab
    leach协议matlab仿真代码
    无线传感器网络数据融合技术
    无线传感器网络数据融合概述
    No pressure, no diamonds.
    Hibernate缓存应用的积累与总结
  • 原文地址:https://www.cnblogs.com/Blogggggg/p/9395955.html
Copyright © 2011-2022 走看看