YbtOJ 選點構形 尤拉函式

2022-09-22 04:42:06 字數 977 閱讀 5257

乙個圓上,你需要在\(3\sim n\)中選出\(k\)個作為\(a_i\),然後再圓上選擇最少的點使得對於每個\(a_i\)你都能用選出的點連成乙個正\(a_i\)邊形。

\(k+2\leq n\leq 10^6\)

首先我們固定乙個\(0\)點因為肯定所有的正\(a_i\)邊形都交於乙個點。

然後考慮對於乙個\(a_i\),我們需要的點就是\(\frac\times k(0\leq k。

注意到乙個\(a_i\)如果存在乙個\(a_j=k\times a_i\)那麼\(a_i\)就不會產生貢獻。反過來說\(a_j\)的貢獻會減少\(a_i\)。

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

那麼我們可以把\(3\sim n\)按照\(\varphi\)排序從小到大加就好了。

至於\(1,2\),特判一下比較小的情況就可以了,\(k\)比較大時顯然\(1,2\)會被選上去,需要多選\(2\)個。

時間複雜度:\(o(n\log n)\)

#include#include#includeusing namespace std;

const int n=1e6+10;

int n,k,cnt,phi[n],pri[n/10];

bool v[n];

int main()

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;

}

尤拉函式 尤拉定理

尤拉函式 對正整數 n,尤拉函式 是小於等於 n的數中與 n互質的數的數目 此函式以其首名研究者尤拉命名 euler so totientfunction 它又稱為 euler stotient function 函式 尤拉商數等。例如 8 4,因為 1,3,5,7均和8 互質。注 n為1時尤拉函式...

尤拉函式 尤拉定理

尤拉函式 設 n 為正整數,則 1,2,n 中與 n 互素的整數的個數計作 n 叫做尤拉函式。設 p 是素數,p p 1設 p 是素數,pa pa p a 1 設 p,q 是不同的素數,n q p,n p q 即 n p 1 q 1 設 m,n 是兩個正整數,且 m,n 1,若 n m n,n m ...

尤拉函式尤拉篩

尤拉函式求小於等於n與n互質的數的個數 複習時發現這個知識點竟然沒有整理 n為素數即為n 1 除了其本身 n為素數的倍數 ola sushu j i ola i sushu j else ola sushu j i ola i sushu j 1 include include include in...