• 洛谷P1892 莫比乌斯反演,套路处理技巧


    题意:

    给出 n , m n,m n,m,计算
    ∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m} lcm(i,j) i=1nj=1mlcm(i,j)

    Solution:

    l c m lcm lcm不好处理转化为 g c d gcd gcd,有
    ∑ i = 1 n ∑ j = 1 m i j g c d ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{gcd(i,j)} i=1nj=1mgcd(i,j)ij
    优先枚举因子 g c d gcd gcd,这样可以转化成整除问题
    ∑ d = 1 n ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ] i j d \sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=d]\frac{ij}{d} d=1ni=1nj=1m[gcd(i,j)=d]dij
    利用 g c d ( i , j ) = d ⇒ g c d ( i d , j d ) = 1 gcd(i,j)=d\Rightarrow gcd(\frac{i}{d},\frac{j}{d})=1 gcd(i,j)=dgcd(di,dj)=1,枚举右式的 i d , j d \frac{i}{d},\frac{j}{d} di,dj作为新的 i , j i,j i,j
    ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ g c d ( i , j ) = 1 ] i d ⋅ j d d = ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ g c d ( i , j ) = 1 ] i j d \sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)=1]\frac{id\cdot jd}{d}=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)=1]ijd d=1ni=1dnj=1dm[gcd(i,j)=1]didjd=d=1ni=1dnj=1dm[gcd(i,j)=1]ijd
    d d d提出
    ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ g c d ( i , j ) = 1 ] i j \sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)=1]ij d=1ndi=1dnj=1dm[gcd(i,j)=1]ij
    莫比乌斯函数的性质 ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n} \mu(d)=[n=1] dnμ(d)=[n=1],可以将布尔表达式转化为整除,于是即求
    ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j ∑ t ∣ g c d ( i , j ) μ ( t ) \sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij\sum_{t|gcd(i,j)}\mu(t) d=1ndi=1dnj=1dmijtgcd(i,j)μ(t)
    再次优先枚举因子 t t t,此时知道因子,只需找因子的所有倍数的和,倍数有
    t , 2 t , 3 t , . . . . t,2t,3t,.... t,2t,3t,....
    那么对于 n n n,小于 n n n的倍数有 ⌊ n t ⌋ \lfloor\frac{n}{t}\rfloor tn个,求和即为
    t ( 1 + 2 + 3 + . . . + ⌊ n d ⌋ ) t(1+2+3+...+\lfloor\frac{n}{d}\rfloor) t(1+2+3+...+dn⌋)
    s u m ( i ) = 1 + 2 + . . . + i = ( 1 + i ) ( i ) 2 sum(i)=1+2+...+i=\frac{(1+i)(i)}{2} sum(i)=1+2+...+i=2(1+i)(i),那么原式可以写作
    ∑ d = 1 n d ∑ t m i n { ⌊ n d ⌋ , ⌊ m d ⌋ } t 2 μ ( t ) s u m ( ⌊ n d ⌋ t ) s u m ( ⌊ m d ⌋ t ) \sum_{d=1}^{n}d\sum_{t}^{min\{\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor\}}t^2\mu(t) sum(\frac{\lfloor\frac{n}{d}\rfloor}{t})sum(\frac{\lfloor\frac{m}{d}\rfloor}{t}) d=1ndtmin{⌊dn,dm⌋}t2μ(t)sum(tdn)sum(tdm)
    在题目内,可以交换 n , m n,m n,m,那么不妨假设 n ≤ m n\leq m nm,即求
    ∑ d = 1 n d ∑ t ⌊ n d ⌋ t 2 μ ( t ) s u m ( ⌊ n d t ⌋ ) s u m ( ⌊ m d t ⌋ ) \sum_{d=1}^{n}d\sum_{t}^{\lfloor\frac{n}{d}\rfloor}t^2\mu(t) sum(\lfloor\frac{n}{dt}\rfloor)sum(\lfloor\frac{m}{dt}\rfloor) d=1ndtdnt2μ(t)sum(⌊dtn⌋)sum(⌊dtm⌋)
    枚举 T = d t T=dt T=dt,由于此时 t t t T T T的一个因子,此时枚举 d d d T T T的因子,地位相当于上式的 t t t
    ∑ T = 1 n s u m ( ⌊ n T ⌋ ) s u m ( ⌊ m T ⌋ ) T ∑ d ∣ T d μ ( d ) \sum_{T=1}^{n}sum(\lfloor\frac{n}{T}\rfloor)sum(\lfloor\frac{m}{T}\rfloor)T\sum_{d|T}d\mu(d) T=1nsum(⌊Tn⌋)sum(⌊Tm⌋)TdTdμ(d)
    其中 s u m ( ⌊ n T ⌋ ) s u m ( ⌊ m T ⌋ ) sum(\lfloor\frac{n}{T}\rfloor)sum(\lfloor\frac{m}{T}\rfloor) sum(⌊Tn⌋)sum(⌊Tm⌋)可以整除分块解决,此时的整除分块应该保证 ⌊ n T ⌋ \lfloor\frac{n}{T}\rfloor Tn ⌊ m T ⌋ \lfloor\frac{m}{T}\rfloor Tm都在这个范围是不变的,所以 r r r端点需要两次结果取小,剩下只需要快速求得
    f ( T ) = ∑ d ∣ T d μ ( d ) f(T)=\sum_{d|T}d\mu(d) f(T)=dTdμ(d)
    一般数论函数都是积性的,所以我们考虑给一个求出来的 f ( T ) f(T) f(T) T T T添加一个质因子 p p p

    • 如果 T T T含有 p p p,由于当一个数 n n n出现了质因子的平方的时候, μ ( n ) = 0 \mu(n)=0 μ(n)=0,所以这个 p , T p,T p,T的分解方式不能给 μ ( T p ) \mu(Tp) μ(Tp)带来贡献,所以 f ( T p ) = f ( T ) f(Tp)=f(T) f(Tp)=f(T)

    • 如果 T T T不含有 p p p,由于积性函数, f ( T p ) = f ( T ) f ( p ) f(Tp)=f(T)f(p) f(Tp)=f(T)f(p)

    这样就可以线性筛出所有的 f ( T ) f(T) f(T),只需要对 T f ( T ) Tf(T) Tf(T)做前缀和即可

    设一个质因子为 p p p,由于 μ ( p ) = 1 − 1 = 0 \mu(p)=1-1=0 μ(p)=11=0,于是设定 f ( p ) = μ ( p ) f(p)=\mu(p) f(p)=μ(p)时即筛 μ ( i ) \mu(i) μ(i),上述方法只是一个筛 μ ( i ) \mu(i) μ(i)的改动版

    总时间复杂度 O ( n ) O(n) O(n)

    // #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    
    using ll=long long;
    const int N=1e7+5,inf=0x3fffffff;
    const long long INF=0x3fffffffffffffff,mod=20101009;
    
    bool nt[N];
    int prime[N],cnt;
    ll n,m,ans,f[N],sum[N];
    
    void make_prime()
    {
        f[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!nt[i]) prime[++cnt]=i,f[i]=((1-i)%mod+mod)%mod;
            for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
            {
                nt[i*prime[j]]=true;
                if(i%prime[j]==0) 
                {
                    f[i*prime[j]]=f[i];
                    break;
                }
                else f[i*prime[j]]=f[i]*f[prime[j]]%mod;
            }
        }
        for(int i=1;i<=n;i++) f[i]=(f[i-1]+1ll*i*f[i]%mod)%mod;
        for(int i=1;i<=m;i++) sum[i]=(sum[i-1]+i)%mod;
    }
    
    ll query(ll l,ll r){
        return ((f[r]-f[l-1])%mod+mod)%mod;
    }
    
    int main()
    {
        cin>>n>>m;
        if(n>m) swap(n,m);
        make_prime();
        for(ll l=1,r,val;l<=n;l=r+1)
        {
            val=n/l; r=val?min(n/val,n):n;
            val=m/l; r=min(r,val?min(m/val,m):m);
            ans=(ans+sum[n/l]*sum[m/l]%mod*query(l,r)%mod)%mod;
        }
        cout<<ans;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    亚马逊运营纯干货:如何引流?亚马逊站外引流最全讲解
    论文笔记:多标签学习——BP-MLL算法
    【嵌入式C内存管理】
    GoogLeNet网络详解
    Revit如何快速做净高分析?方便、快捷的方法来了
    给你 2 万条数据,怎么快速导入到 MySQL?写得太好了...
    MongoDB ObjectId() 是如何实现的 “千万级” 分布式唯一 ID?
    内核中的互斥锁的使用
    linux在anaconda环境中配置GPU版本的cuda+cudnn+pytorch深度学习环境(简单可行!一次完成!)
    如何获取淘宝sku详细信息 API接口
  • 原文地址:https://blog.csdn.net/stdforces/article/details/127770592