21.6.24 t2
阿新 • • 發佈:2021-06-24
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; }