P2398 GCD SUM

原题链接

题解

\(ans=\sum_{i=1}^{n} i*sum[i]\)
其中 \(sum[i]\) 为最大公约数为 \(i\) 的对数
\(f[i]\) 为最大公约数为 \(i\) 的倍数的对数
则有 \(sum[i]=f[i]-sum[2i]-sum[3i]-...-sum[ki]\)
\(f[i]={\lfloor \frac{n}{i} \rfloor}^2\) (如果没懂请仔细阅读题目所给符号)
所以 \(sum[i]={\lfloor \frac{n}{i} \rfloor}^2-sum[2i]-sum[3i]-...-sum[ki]\)

实施

倒着遍历算 \(sum\)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll sum[100005];
void solve()
{
    ll n;
    cin>>n;
    ll ans=0;
    for(ll i=n;i>=1;i--)
    {
        sum[i]=(n/i)*(n/i);
        for(ll j=i*2LL;j<=n;j+=i) sum[i]-=sum[j];
        ans+=i*sum[i];
    }
    cout<<ans;
}
int main()
{
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}


posted @ 2024-07-10 17:50  纯粹的  阅读(20)  评论(0)    收藏  举报