题解
\(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;
}
标签:lfloor,ll,GCD,sum,rfloor,P2398,ans,SUM
From: https://www.cnblogs.com/pure4knowledge/p/18294730