cf1208G Polygons 尤拉函式

2022-02-28 15:36:35 字數 917 閱讀 3129

cf

給你兩個正整數\(n\)和\(k\),詢問在乙個圓上你最少需要幾個點構才能造出\(k\)個邊數小於等於\(n\)的正多邊形

性質1考慮加進乙個\(x\)邊形。那麼他的因子\(d\)一定在他之前加進來了.

因為\(d\)可以完全由\(x\)的點表現出來。

如果沒加\(d\),那麼加\(d\)顯然比加\(x\)優秀(顯然)。

性質2兩個圖形,讓他們盡量多的重合些點是好的。

那兩個圖形能重合多少點呢?答案顯然是固定的。

兩個圖形讓他們乙個點重合,即可得到最好的。

因為是正多邊形,所以隨便重合乙個點,重合的情況都是一樣的。

即最優的答案。

所以我們加入的\(k\)個正多邊形都重合到乙個點上,設這個點為\(0\)點。

聯絡起來

\(x\)在圓上,假設他的點為\(\frac,\frac……\frac\)

由\(part2\)可以知道,0這個點上每個圖形都會經過。

由\(part1\)可以知道\(x\)的點上,他的因子在之前就會加入,所以他的因子及其倍數都是原先就有的(被覆蓋過)。

這個過程就是類似於暴力篩\(phi\)的過程,所以剩下的就是與他互質的數。

所以乙個正\(x\)邊形的貢獻就是\(phi(x)\).

找出\(k\)個最小的\(phi\)就行了

其實這個題就是俄羅斯數學競賽的題目....我同桌給我講過類似的證明,忘記了(菜)。

因為1,2不是正x邊形,所以不能選為k變形

#include using namespace std;

const int _=1e6+7,limit=1e6;

int phi[_];

void euler() }}

std::vectorans;

int main()

12 08學習計畫

1 多看看matlab的資料啊,下午要考試了。1 資料呢,沒看完。習題差不多看完了。先說說考試吧,根本就不會有原題啊!考試倆小時,翻書倆小時!就說嘛,開卷考怎麼可能那麼簡單,放給你資料都不知道去 翻啊 考題中有兩個說是protel的,我剛開始以為是proteus,但是題目中提到電氣連線,我一直沒找到...

dp(不含優化) 12 08

description 給出 n 個點,其中有 n 1條有向邊,邊的方向可以改變,問最少改變多少條邊可以從某乙個點到達任意乙個點,同時求出這些點。solution 於是我們可以換根。description 給一顆 n 個結點的樹,節點編號為 1n 問刪除乙個節點之後,讓剩下的分支中節點數量最多的盡量...

Luogu P1208 混合牛奶

這個題目直接開個結構體按 排序,然後一直加加加,就可以了。典型的貪心。include include include include include include using namespace std int i,m,n,j,k,ans struct mana 5001 bool cmp man...