21.6.24 t2
tag:贪心
首先选择 \([n+1,2n]\),然后倒叙枚举 \(n\to1\),对于每个数 \(i\),如果 \(i\) 的所有倍数中,只有 \(1\) 个被选中了,那么就可以用 \(i\) 去替换那个倍数。
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void Read(T &n){
char ch; bool flag=false;
while(!isdigit(ch=getchar()))if(ch=='-')flag=true;
for(n=ch^48;isdigit(ch=getchar());n=(n<<1)+(n<<3)+(ch^48));
if(flag)n=-n;
}
enum{
MAXN = 500005
};
int n;
char vis[MAXN<<1];
int main(){
Read(n); n<<=1;
long long ans=0;
for(int i=n/2+1; i<=n; i++) ans += i, vis[i] = true;
for(int i=n/2; i; i--){
int id = -1;
for(int j=i+i; j<=n; j+=i)
if(vis[j]){
if(id==-1) id = j;
else{id = -1; break;}
}
if(id==-1) continue;
ans -= id; ans += i;
vis[id] = false; vis[i] = true;
}
cout<<ans<<'\n';
return 0;
}