日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cf1208G Polygons 欧拉函数

發布時間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cf1208G Polygons 欧拉函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接

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

思路

深受迫害,所以寫的詳細一點,不會請留言。

性質1

考慮加進一個\(x\)邊形。那么他的因子\(d\)一定在他之前加進來了.
因為\(d\)可以完全由\(x\)的點表現出來。
如果沒加\(d\),那么加\(d\)顯然比加\(x\)優秀(顯然)。

性質2

兩個圖形,讓他們盡量多的重合些點是好的。
那兩個圖形能重合多少點呢?答案顯然是固定的。
兩個圖形讓他們一個點重合,即可得到最好的。
因為是正多邊形,所以隨便重合一個點,重合的情況都是一樣的。
即最優的答案。
所以我們加入的\(k\)個正多邊形都重合到一個點上,設這個點為\(0\)點。

聯系起來

\(x\)在圓上,假設他的點為\(\frac{0}{x},\frac{1}{x}……\frac{x-1}{x}\)
\(part2\)可以知道,0這個點上每個圖形都會經過。
\(part1\)可以知道\(x\)的點上,他的因子在之前就會加入,所以他的因子及其倍數都是原先就有的(被覆蓋過)。
這個過程就是類似于暴力篩\(phi\)的過程,所以剩下的就是與他互質的數。
所以一個正\(x\)邊形的貢獻就是\(phi(x)\).
找出\(k\)個最小的\(phi\)就行了
其實這個題就是俄羅斯數學競賽的題目....我同桌給我講過類似的證明,忘記了(菜)。

代碼

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

#include <bits/stdc++.h> using namespace std; const int _=1e6+7,limit=1e6; int phi[_]; void Euler() {for(int i=1;i<=limit;++i) phi[i]=i;for(int i=2;i<=limit;++i) {if(phi[i]==i) {phi[i]=i-1;for(int j=i+i;j<=limit;j+=i)phi[j]=(phi[j]/i)*(i-1);}} } std::vector<int> ans; int main() {Euler();int n,k;cin>>n>>k;if(k==1) return puts("3"),0;for(int i=3;i<=n;++i) ans.push_back(phi[i]);sort(ans.begin(),ans.end());long long tot=0;for(int i=0;i<k;++i) tot+=ans[i];cout<<tot+2<<"\n";return 0; }

轉載于:https://www.cnblogs.com/dsrdsr/p/11428182.html

總結

以上是生活随笔為你收集整理的cf1208G Polygons 欧拉函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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