1 条题解

  • 0
    @ 2026-1-17 21:10:30

    考察

    $$\sum_{i=1}^{n} lcm(i,n)=\sum_{i=1}^{n} in/gcd(i,n)$$=ni=1ni/gcd(i,n)=n\sum_{i=1}^{n} i/gcd(i,n)

    那我们可以计算对于每个dd作为gcd(i,n)gcd(i,n)时,它对答案的贡献,就有

    $$=n\sum_{d|n}\sum_{i=1}^{n} \frac{i}{d}[gcd(i,n)==d]$$

    考虑到如果gcd(i,n)==dgcd(i,n)==d,必然有iidd的倍数,因此不妨将i的意义转化为原来的i/di/d,也即

    $$=n\sum_{d|n}\sum_{i=1}^{n/d} \frac{i}{d}[gcd(id,n)==d]$$=ndni=1n/di[gcd(i,n/d)==1]=n\sum_{d|n}\sum_{i=1}^{n/d} i[gcd(i,n/d)==1] =ndni=1di[gcd(i,d)==1]=n\sum_{d|n}\sum_{i=1}^{d} i[gcd(i,d)==1]

    注意到i=1di[gcd(i,d)==1]\sum_{i=1}^{d} i[gcd(i,d)==1]表示[1,d][1,d]中与dd互质的数的和,它等于φ(d)d2\frac{\varphi(d)d}{2}(当d=1d=1时为11)。证明如下:

    d>1d>1时,φ(d)\varphi(d)总是偶数,这是因为与dd互质的数总是成对出现。具体来说,假如iidd互质,did-idd肯定也互质,它们的和是dd,并且有φ(d)/2\varphi(d)/2对。

    于是上式化简为

    =ndnφ(d)d2=n\sum_{d|n}\frac{\varphi(d)d}{2}

    f(d)=dnφ(d)d2f(d)=\sum_{d|n}\frac{\varphi(d)d}{2}

    那么对于每个1dn1\le d\le n,我们只要把φ(d)d2\frac{\varphi(d)d}{2}加到f(dj)f(dj)中去,询问时再把最外面那个nn乘进去。复杂度是O(nlogn+T)O(nlogn+T)

    #include <cstdio>
    const int N=1000000;
    int tot,p[N+5],phi[N+5];
    long long ans[N+5];
    bool flg[N+5];
    
    void solve() {
        phi[1]=1;
        for(int i=2;i<=N;++i) {
            if(!flg[i]) p[++tot]=i,phi[i]=i-1;
            for(int j=1;j<=tot&&i*p[j]<=N;++j) {
                flg[i*p[j]]=1;
                if(i%p[j]==0) {
                    phi[i*p[j]]=phi[i]*p[j];
                    break;
                }
                phi[i*p[j]]=phi[i]*(p[j]-1);
            }
        }
        for(int i=1;i<=N;++i) {
            for(int j=1;i*j<=N;++j) {
                ans[i*j]+=1LL*j*phi[j]/2;
            }
        }
        for(int i=1;i<=N;++i) ans[i]=1LL*i*ans[i]+i;
    }
    int main() {
        int T,n;
        solve();
        for(scanf("%d",&T);T;--T) {
            scanf("%d",&n);
            printf("%lld\n",ans[n]);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    3891
    时间
    200ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者