洛谷 P1414 又是畢業季II 最大公約數

2022-02-13 14:25:09 字數 1698 閱讀 5923

「叮鈴鈴鈴」,隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不捨,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!

彩排了一次,老師不太滿意。當然啦,取每位同學的號數來找最大公約數顯然不太合理。於是老師給每位同學評了乙個能力值。於是現在問題變為,從n個學生中挑出k個人使得他們的默契程度(即能力值的最大公約數)最大。但因為節目太多了,而且每個節目需要的人數又不知道。老師想要知道所有情況下能達到的最大默契程度是多少。這下子更麻煩了,還是交給你吧~

ps:乙個數的最大公約數即本身。

輸入格式:

第一行乙個正整數n。

第二行為n個空格隔開的正整數,表示每個學生的能力值。

輸出格式:

總共n行,第i行為k=i情況下的最大默契程度。

輸入樣例#1:

4

1 2 3 4

輸出樣例#1:

421

1

【資料範圍】

記輸入資料中能力值的最大值為inf。

對於20%的資料,n<=5,inf<=1000

對於另30%的資料,n<=100,inf<=10

對於100%的資料,n<=10000,inf<=1e6

這個題就是求從n個數中選1...n個數時的最大公因數。

首先,資料範圍較大,暴力列舉肯定要炸,所以我們需要換一種思路。

我們用vis[i]存下i出現的次數,用num[i]表示以i為因數的數(i的倍數)一共有多少個,用ans[i]表示選i個數的最大公因數。 

所以我們列舉每乙個因數,記錄下這乙個因數在這n個數中有多少個倍數,用num記錄。

然後列舉每乙個因數,根據num得知他是多少個數的因數,然後不斷更新答案。

因為列舉因數時是從小到大列舉的,所以ans的每一次更新的值都會比原來的數值大,保證了答案的正確性。

具體過程請看**(內有具體思路)。

1 #include2 #include3

using

namespace std; //

vis[i]表示 i出現的次數

4int n,vis[1000005],num[1000005],ans[10005]; //

num[i]表示以i為因數的數(i的倍數)一共有多少個,ans[i]表示選i個數的最大公因數

5int maxx; //

maxx存的是n個正整數的最大值。這樣節約了時間

6int

main()715

for(int i=1;i<=maxx;i++) //

i列舉的是因數

16for(int j=i;j<=maxx;j+=i)

19for(int i=1;i<=maxx;i++) //

i列舉的是因數

20for(int j=1;j<=num[i];j++)

23for(int i=1;i<=n;i++) cout/

輸出 24

return0;

25 }

ac**(附解析)

洛谷 P1414 又是畢業季II

題目背景 叮鈴鈴鈴 隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不捨,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!題目描述 彩排了一次,老師不太滿意。當然啦,取每位同學的號數來找最大公約數顯然不太合...

又是畢業季II 洛谷p1414

叮鈴鈴鈴 隨著高考最後一科結考鈴聲的敲響,三年青春時光頓時凝固於此刻。畢業的欣喜怎敵那離別的不捨,憧憬著未來仍毋忘逝去的歌。1000多個日夜的歡笑和淚水,全凝聚在畢業晚會上,相信,這一定是一生最難忘的時刻!彩排了一次,老師不太滿意。當然啦,取每位同學的號數來找最大公約數顯然不太合理。於是老師給每位同...

洛谷 P1414 又是畢業季II

老師給每位同學評了乙個能力值。於是現在問題變為,從n個學生中挑出k個人使得他們的默契程度 即能力值的最大公約數 最大。但因為節目太多了,而且每個節目需要的人數又不知道。老師想要知道所有情況下能達到的最大默契程度是多少。這下子更麻煩了,還是交給你吧 ps 乙個數的最大公約數即本身。輸入格式 第一行乙個...