LGP6156题解

真·简单题

题目大意

给定 \(n\)\(k\),求出这个柿子的值:

\[\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\mu^2(\gcd(i,j)gcd(i,j) \]

按照莫反的套路,我们枚举 \(\gcd\)

\[\sum_{d=1}^n d \sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=d]\mu^2(d)(i+j)^k \]

\[\sum_{d=1}^n \mu^2(d)d \sum_{i=1}^{\lfloor \frac n d \rfloor}\sum_{j=1}^{\lfloor \frac n d \rfloor}[\gcd(i,j)=1]d^k(i+j)^k \]

来一发反演:

\[\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{i=1}^{\lfloor \frac n d \rfloor}\sum_{j=1}^{\lfloor \frac n d \rfloor}(i+j)^k\sum_{x|i \And x|j}\mu(x) \]

\[\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{x=1}^{\lfloor \frac n d \rfloor}\mu(x)\sum_{i=1}^{\lfloor \frac n d \rfloor}\sum_{j=1}^{\lfloor \frac n d \rfloor}x^k(i+j)^k \]

\[\sum_{d=1}^n \mu^2(d)d^{k+1}\sum_{x=1}^{\lfloor \frac n d \rfloor}\mu(x)x^k\sum_{i=1}^{\lfloor \frac n {dx} \rfloor}\sum_{j=1}^{\lfloor \frac n {dx} \rfloor}(i+j)^k \]

\(f(n) = \sum_{i=1}^n\sum_{j=1}^n(i+j)^k\)

\[\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{x=1}^{\lfloor \frac n d \rfloor}\mu(x)x^kf(\frac n {dx}) \]

再考虑套路,令 \(T = dx\)

\[\sum_{T=1}^n \sum_{x|T}\mu(x)x^k\mu^2(\frac T x)(\frac T x)^{k+1}f(\frac n T) \]

\[\sum_{T=1}^nT^kf(\frac n T)\sum_{x|T}\mu(x)\mu^2(\frac T x)id(\frac T x) \]

后面的部分明显是狄利克雷卷积的形式

\[\sum_{T=1}^nT^kf(\frac n T)((id·\mu^2) * \mu)(T) \]

然后我们来考虑 \(f\)

\[\sum_{i=1}^n\sum_{j=1}^n(i+j)^k \]

经过 简单 复杂的推导后,发现它等于:

\[\sum_{i=1}^{2n}\min(i,2n-i) \times i^k \]

我们再设:

\[S(n)=\sum_{i=1}^n i^k \]

\[sum(n)=\sum_{i=1}^nS(i) \]

就会发现:

\[f(n) = sum(2n)-2 \times sum(n) \]

然后我们来考虑这个毒瘤的积性函数:

\[F=((id · \mu^2) * \mu) \]

虽然可以 \(O(n\log n)\) 暴力预处理,但是显然会 \(\rm TLE\),由于这是一个积性函数,考虑对其线性筛。

\[F(p) = ((id(p) \times \mu^2(p)) * \mu(1) ) + ((id(1) \times \mu^2(1)) * \mu(p) = p - 1 \]

\[F(p^2) = ((id(p^2) \times \mu^2(p^2)) * \mu(1) ) + ((id(p) \times \mu^2(p)) * \mu(p) + ((id(1) \times \mu^2(1)) * \mu(p^2) = 0 - p + 0 = -p \]

因为鸽笼原理,\(F(p^e) (3 \leq e )\) 中,要么 \(\mu^2(p^k)\)\(0\)(即 \(id(p^k) \times \mu^2(p^k)\)\(0\)),要么 \(\mu(p^{e-k})\)\(0\),即 \(F(p^e) = 0 (3 \leq e)\)
那么我们就可以线性筛 \(F\) 了。

然后来考虑 \(S\)\(sum\),容易发现 \(S\) 其实就是 \(id^k\) 的前缀和,所以能够线性筛,那么 \(sum\) 也可以在线性时间内预处理。

复杂度:预处理 \(O(n)\),询问 \(O(\sqrt n)\)

code:

#include<cstdio>
const int M=1e7+5,mod=998244353;
int n,k,top,f[M],sum[M],pri[M],zhi[M];
inline int Add(const int&a,const int&b){
    return a+b>=mod?a+b-mod:a+b;
}
inline int pow(int a,int b){
    int ans=1;
    for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*a*ans%mod;
    return ans;
}
void sieve(){
    int i,j,x;
    f[1]=sum[1]=zhi[1]=1;
    for(i=2;i<=(n<<1);++i){
        if(!zhi[i])pri[++top]=i,f[i]=i-1,sum[i]=pow(i,k);
        for(j=1;j<=top&&(x=i*pri[j])<=(n<<1);++j){
            zhi[x]=1;
            sum[x]=1ll*sum[i]*sum[pri[j]]%mod;
            if(i%pri[j]){
                f[x]=1ll*f[i]*(pri[j]-1)%mod;
            }
            else{
                if(i/pri[j]%pri[j])f[x]=1ll*f[i/pri[j]]*(mod-pri[j])%mod;
                break;
            }
        }
    }
    for(i=1;i<=(n<<1);++i){
        f[i]=Add(f[i-1],1ll*f[i]*sum[i]%mod);
        sum[i]=Add(sum[i],sum[i-1]);
    }
    for(i=1;i<=(n<<1);++i)sum[i]=Add(sum[i-1],sum[i]);
}
inline int S(const int&n){
    return (sum[n<<1]-(sum[n]<<1)%mod+mod)%mod;
}
signed main(){
    int i,ans=0;
    long long tmp;
    scanf("%d%lld",&n,&tmp);
    k=tmp%(mod-1);
    sieve();
    for(int L=1,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=Add(ans,1ll*(f[R]-f[L-1]+mod)%mod*S(n/L)%mod);
    }
    printf("%d",ans);
}
posted @ 2022-01-10 15:31  Prean  阅读(27)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};