P3768 简单的数学题(杜教筛+莫比乌斯反演)

题意

给定n和p(p为质数)求 ∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) % p \sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\% p i=1nj=1nijgcd(i,j)%p
n ≤ 1 0 10 , 5 × 1 0 8 ≤ p ≤ 1.1 × 1 0 9 n\le 10^{10},5\times 10^8\le p\le1.1 \times 10^9 n1010,5×108p1.1×109

思路

经典的先提出gcd
= ∑ d = 1 n d ∑ i = 1 n ∑ j = 1 n i j [ g c d ( i , j ) = = d ] =\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d] =d=1ndi=1nj=1nij[gcd(i,j)==d]
后面的部分除以d,有
= ∑ d = 1 n d ∑ i = 1 n d ∑ j = 1 n d d i   d j [ g c d ( i , j ) = = 1 ] =\sum_{d=1}^nd\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}di\ dj[gcd(i,j)==1] =d=1ndi=1dnj=1dndi dj[gcd(i,j)==1]
提出后面的d
= ∑ d = 1 n d 3 ∑ i = 1 n d ∑ j = 1 n d i j [ g c d ( i , j ) = = 1 ] =\sum_{d=1}^nd^3\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}ij[gcd(i,j)==1] =d=1nd3i=1dnj=1dnij[gcd(i,j)==1]
然后进行莫比乌斯反演,将 ∑ d ∣ n μ ( d ) = [ n = = 1 ] \sum_{d|n}\mu(d)=[n==1] dnμ(d)=[n==1]带入有
= ∑ d = 1 n d 3 ∑ i = 1 n d ∑ j = 1 n d i j ∑ k ∣ g c d ( i , j ) μ ( k ) =\sum_{d=1}^nd^3\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}ij\sum_{k|gcd(i,j)}\mu(k) =d=1nd3i=1dnj=1dnijkgcd(i,j)μ(k)
将k提出有,及枚举1到 n d \frac{n}{d} dn内k的倍数
= ∑ d = 1 n d 3 ∑ k = 1 n d μ ( k ) ∑ i = 1 n d k ∑ j = 1 n d k k i   k j =\sum_{d=1}^nd^3\sum_{k=1}^{\frac{n}{d}}\mu(k)\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ki\ kj =d=1nd3k=1dnμ(k)i=1dknj=1dknki kj
= ∑ d = 1 n d 3 ∑ k = 1 n d μ ( k ) k 2 ∑ i = 1 n d k ∑ j = 1 n d k i j =\sum_{d=1}^nd^3\sum_{k=1}^{\frac{n}{d}}\mu(k)k^2\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ij =d=1nd3k=1dnμ(k)k2i=1dknj=1dknij
上式等价于
= ∑ d = 1 n d 3 ∑ d k = 1 n μ ( k ) k 2 ∑ i = 1 n d k ∑ j = 1 n d k i j =\sum_{d=1}^nd^3\sum_{dk=1}^{n}\mu(k)k^2\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ij =d=1nd3dk=1nμ(k)k2i=1dknj=1dknij
T = d k T=dk T=dk

= ∑ d = 1 n d 3 ∑ T = 1 n [ T % d = = 0 ] μ ( T d ) ( T d ) 2 ∑ i = 1 n T ∑ j = 1 n T i j =\sum_{d=1}^nd^3\sum_{T=1}^{n}[T\% d==0]\mu(\frac{T}{d})(\frac{T}{d})^2\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij =d=1nd3T=1n[T%d==0]μ(dT)(dT)2i=1Tnj=1Tnij
我们将 d 3 d^3 d3乘入
= ∑ d = 1 n ∑ T = 1 n [ T % d = = 0 ] μ ( T d ) d T 2 ∑ i = 1 n T ∑ j = 1 n T i j =\sum_{d=1}^n\sum_{T=1}^{n}[T\% d==0]\mu(\frac{T}{d})dT^2\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij =d=1nT=1n[T%d==0]μ(dT)dT2i=1Tnj=1Tnij
这里可以看作枚举的是1到n中每一个d的倍数,那么我们也等价于枚举1到n中每个数T的因子

= ∑ T = 1 n T 2 ∑ d ∣ T d μ ( T d ) ∑ i = 1 n T ∑ j = 1 n T i j =\sum_{T=1}^nT^2\sum_{d|T}d\mu(\frac{T}{d})\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij =T=1nT2dTdμ(dT)i=1Tnj=1Tnij
对于式子 ∑ i = 1 n T ∑ j = 1 n T i j \sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij i=1Tnj=1Tnij

∑ i = 1 n T i ∑ j = 1 n T j = ∑ i = 1 n T i ( ( ⌊ n T ⌋ + 1 ) ⌊ n T ⌋ 2 ) = ( ( ⌊ n T ⌋ + 1 ) ⌊ n T ⌋ 2 ) 2 \sum_{i=1}^{\frac{n}{T}}i\sum_{j=1}^{\frac{n}{T}}j=\sum_{i=1}^{\frac{n}{T}}i(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})=(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})^2 i=1Tnij=1Tnj=i=1Tni(2(Tn+1)Tn)=(2(Tn+1)Tn)2
对于式子 ∑ d ∣ T d μ ( T d ) \sum_{d|T}d\mu(\frac{T}{d}) dTdμ(dT)可以发现是 i d id id μ \mu μ的狄利克雷卷积 i d ∗ μ = φ id*\mu=\varphi idμ=φ
所以有
= ∑ T = 1 n T 2 φ ( T ) ( ( ⌊ n T ⌋ + 1 ) ⌊ n T ⌋ 2 ) 2 =\sum_{T=1}^nT^2\varphi(T)(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})^2 =T=1nT2φ(T)(2(Tn+1)Tn)2
然后可以对
∑ T = 1 n T 2 φ ( T ) \sum_{T=1}^nT^2\varphi(T) T=1nT2φ(T)用杜教筛
f ( x ) = x 2 φ ( x ) f(x)=x^2\varphi(x) f(x)=x2φ(x) g ( x ) = x 2 g(x)=x^2 g(x)=x2 S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^nf(i) S(n)=i=1nf(i)

∑ i = 1 n g ∗ f = ∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) = ∑ i = 1 n ∑ d ∣ i d 2 ( i d ) 2 φ ( i d ) \sum_{i=1}^ng*f=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{i=1}^n\sum_{d|i}d^2(\frac{i}{d})^2\varphi(\frac{i}{d}) i=1ngf=i=1ndig(d)f(di)=i=1ndid2(di)2φ(di)
= ∑ i = 1 n i 2 ∑ d ∣ i φ ( i d ) =\sum_{i=1}^ni^2\sum_{d|i}\varphi(\frac{i}{d}) =i=1ni2diφ(di)
∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n dnφ(d)=n,故
= ∑ i = 1 n i 3 =\sum_{i=1}^ni^3 =i=1ni3
再看 ∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) \sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d}) i=1ndig(d)f(di)
考虑枚举每个因子的倍数
∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) = ∑ d = 1 n g ( d ) ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ d = 1 n g ( d ) S ( ⌊ n d ⌋ ) \sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{d=1}^ng(d)\sum_{i=1}^{\left \lfloor\frac{n}{d}\right \rfloor}f(i)=\sum_{d=1}^ng(d)S(\left \lfloor\frac{n}{d}\right \rfloor) i=1ndig(d)f(di)=d=1ng(d)i=1dnf(i)=d=1ng(d)S(dn)
g ( 1 ) S ( n ) + ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) = ∑ i = 1 n i 3 g(1)S(n)+\sum_{d=2}^ng(d)S(\left \lfloor\frac{n}{d}\right \rfloor)=\sum_{i=1}^ni^3 g(1)S(n)+d=2ng(d)S(dn)=i=1ni3
g ( x ) = x 2 g(x)=x^2 g(x)=x2带入移项得
S ( n ) = ∑ i = 1 n i 3 − ∑ d = 2 n d 2 S ( ⌊ n d ⌋ ) S(n)=\sum_{i=1}^ni^3-\sum_{d=2}^nd^2S(\left \lfloor\frac{n}{d}\right \rfloor) S(n)=i=1ni3d=2nd2S(dn)

∑ i = 1 n i 3 = ( n ( n + 1 ) 2 ) 2 , ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^ni^3=(\frac{n(n+1)}{2})^2,\sum_{i=1}^ni^2=\frac{n(n+1)(2n+1)}{6} i=1ni3=(2n(n+1))2,i=1ni2=6n(n+1)(2n+1)
用杜教筛就可以做了
注意n大于int,预处理时可能会爆,注意取模

#include <bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int prime[N];
long long phi[N];
int vis[N];
int cnt;
long long mod;
long long inv2;
long long inv4;
long long inv6;
long long quickmod(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b%2==1)
            ans=ans*a%mod;
        b=b/2;
        a=a*a%mod;
    }
    return ans;
}
void init()
{
    cnt=0;
    phi[1]=1;
    for(int i=2;i<N;i++)
    {
        if(!vis[i])
        {
            prime[cnt++]=i;
            phi[i]=i-1;
        }
        for(int j=0;j<cnt&&i*prime[j]<N;j++)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
    for(int i=1;i<N;i++)
        phi[i]=(phi[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
}
map<long long,long long>P;
long long Sum2(long long n)
{
    return n%mod*((n+1)%mod)%mod*(2*n%mod+1)%mod*inv6%mod;
}
long long Sum(long long n)
{
    if(n<N) return phi[n];
    if(P[n]) return P[n];
    long long sum=n%mod*((n+1)%mod)%mod*(n%mod)%mod*((n+1)%mod)%mod*inv4%mod;
    for(long long i=2,last;i<=n;i=last+1)
    {
        last=n/(n/i);
        sum=(sum-(Sum2(last)-Sum2(i-1)+mod)%mod*Sum(n/i)%mod+mod)%mod;
    }
    return P[n]=sum;
}

int main()
{
    long long n;
    scanf("%lld%lld",&mod,&n);
    init();
    inv2=quickmod(2,mod-2);
    inv4=quickmod(4,mod-2);
    inv6=quickmod(6,mod-2);
    long long sum=0;
    for(long long i=1,last;i<=n;i=last+1)
    {
        last=n/(n/i);
        sum=(sum+(Sum(last)-Sum(i-1)+mod)%mod*((n/i+1)%mod)%mod*((n/i)%mod)%mod*((n/i+1)%mod)%mod*((n/i)%mod)%mod*inv4%mod)%mod;
    }
    printf("%lld\n",sum);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值