模板

最后是看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。

$sumlimits_{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) = sumlimits_{d|n}f(d)$

可以得

$f(d) = sumlimits_{d|n}mu(d)F(frac{n}{d})$

倍数有关的(常用):

$F(n) = sumlimits_{n|d}f(d)$

可以得

$f(n) = sumlimits_{n|d}mu(frac{d}{n})F(d)$


示例:

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

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

答案: $f(x) = sumlimits_{x|d}mu(frac{d}{x})F(d) = sumlimits_{k=1}mu(k)F(kx) = sumlimits_{k=1}mu(k){lfloor{frac{n}{kx}}} floor{lfloor{frac{m}{kx}} floor}$

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

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

答案:$sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}gcd(i,j) = sumlimits_{x=1}^{lfloor{frac{n}{d}} floor}mu(x){lfloor{frac{n}{dx}}} floor{lfloor{frac{m}{dx}} floor}$

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

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

答案:$sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}gcd(i,j)^k = sumlimits_{d=1}^{n}d^ksumlimits_{x=1}^{lfloor{frac{n}{d}} floor}mu(x){lfloor{frac{n}{dx}}} floor{lfloor{frac{m}{dx}} floor}$

 第1题算出 $f_2(x)=sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)==x]$ ,这一次我们要求所有的 gcd 的k次方,显然所求为 $f=sumlimits_{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