日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

YbtOJ-选点构形【欧拉函数】

發布時間:2023/12/3 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YbtOJ-选点构形【欧拉函数】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.ybtoj.com.cn/contest/351/problem/1


題目大意

一個圓上,你需要在3~n3\sim n3n中選出kkk個作為aia_iai?,然后再圓上選擇最少的點使得對于每個aia_iai?你都能用選出的點連成一個正aia_iai?邊形。

k+2≤n≤106k+2\leq n\leq 10^6k+2n106


解題思路

首先我們固定一個000點因為肯定所有的正aia_iai?邊形都交于一個點。

然后考慮對于一個aia_iai?,我們需要的點就是1ai×k(0≤k<ai)\frac{1}{a_i}\times k(0\leq k<a_i)ai?1?×k(0k<ai?)

注意到一個aia_iai?如果存在一個aj=k×aia_j=k\times a_iaj?=k×ai?那么aia_iai?就不會產生貢獻。反過來說aja_jaj?的貢獻會減少aia_iai?

而我們肯定是優先選擇aia_iai?的,也就是說aja_jaj?選擇當且僅當它的所有約數都被選擇,而此時aja_jaj?產生的貢獻恰好就是φ(aj)\varphi(a_j)φ(aj?)(因為所有aja_jaj?約數產生的貢獻和為aja_jaj?,我們可以視為它們的貢獻都單獨為φ(x)\varphi(x)φ(x)

那么我們可以把3~n3\sim n3n按照φ\varphiφ排序從小到大加就好了。

至于1,21,21,2,特判一下比較小的情況就可以了,kkk比較大時顯然1,21,21,2會被選上去,需要多選222個。

時間復雜度:O(nlog?n)O(n\log n)O(nlogn)


code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e6+10; int n,k,cnt,phi[N],pri[N/10]; bool v[N]; int main() {freopen("point.in","r",stdin); freopen("point.out","w",stdout);scanf("%d%d",&n,&k);if(k==1)return puts("3")&0;if(k==2)return puts("6")&0;phi[1]=1;for(int i=2;i<=n;i++){if(!v[i])phi[i]=i-1,pri[++cnt]=i;for(int j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[i]*phi[pri[j]];}}sort(phi+1,phi+1+n);long long ans=0;for(int i=1;i<=k+2;i++)ans+=phi[i];printf("%lld\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的YbtOJ-选点构形【欧拉函数】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。