题解:CF1208G Polygons
tangible_love · · 题解
思路
对其他题解的补充。可以配合食用。
很巧妙的题目。拿到题显然考虑类似于反悔贪心的思路:先从小到大加,如果出现不优的方案就进行替换来寻找规律。
那么容易发现对于
回到题目本身。既然跟
那么我们取前
在特判的时候考虑
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,len,ans,pri[1000010],phi[1000010];
bool vis[1000010];
signed main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=2;i<=n;i++){
if(!vis[i]){
pri[++len]=i;
phi[i]=i-1;
}
for(int j=1;i*pri[j]<=n;j++){
vis[i*pri[j]]=true;
if(i%pri[j]) phi[i*pri[j]]=phi[i]*(pri[j]-1);
else{
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
}
}
sort(phi+1,phi+1+n);
for(int i=3;i<=k+2;i++) ans+=phi[i];
cout<<ans+1+(k!=1);
return 0;
}