模板 - 数学 - 数论 - 莫比乌斯反演 - 1

最后是看https://blog.csdn.net/litble/article/details/72804050才懂示例1的,结果示例2推不出来,说明我是乱搞的?

什么乱起八糟的。https://blog.csdn.net/litble/article/details/79509373根据我们做莫比乌斯反演题的经验,枚举gcd的值?

https://blog.csdn.net/ControlBear/article/details/77839443

数论分块?杜教筛?

https://www.cnblogs.com/phile/p/4474087.html

https://www.cnblogs.com/pdev/category/682194.html

狄利克雷卷积

https://blog.csdn.net/a574780196/article/details/82932986


 

莫比乌斯函数的性质:

当x有偶数个不同的质因子,mux=1,奇数个不同的,mu=-1,存在质因子的平方,0。

$\sum\limits_{d|n}{\frac{\mu(d)}{d}}=\frac{\varphi(n)}{n}$


莫比乌斯函数线性筛:

void mobius() {
    int i,j;
    mbs[1] = 1;
    fo(i,2,N) {
        if (!vis[i]) {
            p[++p[0]] = i;
            mbs[i] = -1;
        }
        for (j = 1; j <= p[0] && i * p[j] <= N; j++) {
            vis[i*p[j]] = 1;
            if (i % p[j] == 0) {
                mbs[i*p[j]] = 0;
                break;
            }
            mbs[i*p[j]] = - mbs[i];
        }
    }
}

 

void get_mu(int n)
{
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]){prim[++cnt]=i;mu[i]=-1;}
        for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
        {
            vis[prim[j]*i]=1;
            if(i%prim[j]==0)break;
            else mu[i*prim[j]]=-mu[i];
        }
    }
 }

 

 

 


 

莫比乌斯反演:

因数有关的:

$F(n) = \sum\limits_{d|n}f(d)$

可以得

$f(d) = \sum\limits_{d|n}\mu(d)F(\frac{n}{d})$

倍数有关的(常用):

$F(n) = \sum\limits_{n|d}f(d)$

可以得

$f(n) = \sum\limits_{n|d}\mu(\frac{d}{n})F(d)$


示例:

1.经典问题 求 $f(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==x]$ :

反演对: $F(x) = \sum\limits_{x|d}f(d) = \sum\limits_{k=1}f(kx) =\sum\limits_{k=1}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==kx] = {\lfloor{\frac{n}{x}}}\rfloor{\lfloor{\frac{m}{x}}\rfloor}$ (只要 $i,j$ 都是 $x$ 的倍数, $gcd(i,j)$ 一定是某个 $x$ 的 $k$ 倍)

答案: $f(x) = \sum\limits_{x|d}\mu(\frac{d}{x})F(d) = \sum\limits_{k=1}\mu(k)F(kx) = \sum\limits_{k=1}\mu(k){\lfloor{\frac{n}{kx}}}\rfloor{\lfloor{\frac{m}{kx}}\rfloor}$

 

当 $kx>min(n,m)$ 的时候 $f(kx)=0$ (gcd的上界)。

 

2.求 $f = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j)$ :

答案:$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j) = \sum\limits_{x=1}^{\lfloor{\frac{n}{d}}\rfloor}\mu(x){\lfloor{\frac{n}{dx}}}\rfloor{\lfloor{\frac{m}{dx}}\rfloor}$

 

第1题算出 $f_2(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==x]$ ,这一次我们要求所有的 gcd 的和,显然所求为 $f = \sum\limits_{x=1}xf_2(x)$ 。也就是所有的 gcd 的个数乘上这个gcd本身的值。

 

3.求 $f=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j)^k$ 

答案:$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j)^k = \sum\limits_{d=1}^{n}d^k\sum\limits_{x=1}^{\lfloor{\frac{n}{d}}\rfloor}\mu(x){\lfloor{\frac{n}{dx}}}\rfloor{\lfloor{\frac{m}{dx}}\rfloor}$

 第1题算出 $f_2(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==x]$ ,这一次我们要求所有的 gcd 的k次方,显然所求为 $f=\sum\limits_{x=1}^{N}x^kf_2(x)$ 。也就是所有的 gcd 的个数乘上这个 gcd 的 k 次方值。

4.求给定的 n 个数中有多少个四元组 (a,b,c,d) 的 gcd==1 :

f(t) = 求给定的 n 个数中有多少个四元组 (a,b,c,d) 的 gcd==t ,

F(t) = 求给定的 n 个数中有多少个四元组 (a,b,c,d) 的 gcd==kt 。

那么我们要求 f(1) ,应用倍数公式后,只要快速求解每一个 F(t) 就足够了。由于 k 是任意的,所以 gcd 被我们去掉了,我们只需要求 t 的倍数有m个,然后 $C_m^4$ 就是 F(t)。

 

转载于:https://www.cnblogs.com/Yinku/p/10486966.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值