51nod 最小集合

2021-07-24 07:35:17 字數 1519 閱讀 2083

最小集合

system message

(命題人)

基準時間限制:1 秒 空間限制:131072 kb 分值: 80

a君有乙個集合。

這個集合有個神奇的性質。

若x,y屬於該集合,那麼x與y的最大公因數也屬於該集合。

但是他忘了這個集合中原先有哪些數字。

不過幸運的是,他記起了其中n個數字。

當然,或許會因為過度緊張,他記起來的數字可能會重複。

他想還原原先的集合。

他知道這是不可能的……

現在他想知道的是,原先這個集合中至少存在多少數。

樣例解釋:

該集合中一定存在的是

input

第一行乙個數n(1<=n<=100000)。

第二行n個數,ai(1<=ai<=1000000,1<=i<=n)。表示a君記起來的數字。

輸入的數字可能重複。

output

輸出一行表示至少存在多少種不同的數字。
input示例

5

1 3 4 6 6

output示例

5
分析: 只想到和倍數有關,之後的就沒想出來,還是老老實實看題解吧

官方題解:

觀察題目性質。

性質1:該集合中一定存在輸入的數字中若干數的最大公因數。

這個證明比較簡單,例如我們有 a1

,a2,

...,

an這些數,那麼 gc

d(a1

,a2)

一定存在該集合,然後 gc

d(a1

,a2,

a3)

也一定存在該集合,依次類推。

所以我們對於每個數i,都求出在n個數中有多少數是它的倍數,記為 f(i)。

然後觀察 f(

2×i)

,f(3

×i),

..,f

(x×i

),..

.

中是否存在乙個數等於 f(

i),若不存在,則i一定存在於該集合。

總複雜度為 ma

xni=

1ai×

lg(m

axni

=1ai

)

#include const int n = 1000100;

bool vis[n];

int cnt[n];

int main()

for(int i = 1; i <= limit; i++)

for(int j = i; j <= limit; j += i)

int ans = 0;

for(int i = 1; i <= limit; i++)}}

else ok = false;

if(ok) ans++;

}printf("%d\n", ans);

return 0;

}

51nod 1616 最小集合

原題鏈結 1616 最小集合 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 a君有乙個集合。這個集合有個神奇的性質。若x,y屬於該集合,那麼x與y的最大公因數也屬於該集合。但是他忘了這個集合中原先有哪些數字。不過幸運的是,他記起了其中n個數字。當然,或許會因為過...

51nod 最小正字段和

1065 最小正子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 收藏 關注 n個整數組成的序列a 1 a 2 a 3 a n 從中選出乙個子串行 a i a i 1 a j 使這個子串行的和 0,並且這個和是所有和 0的子串行中最小的。例如 4,1,5,2...

51nod 最小方差 1098

若x1,x2,x3 xn的平均數為k。則方差s 2 1 n x1 k 2 x2 k 2 xn k 2 方差即偏離平方的均值,稱為標準差或均方差,方差描述波動程度。給出m個數,從中找出n個數,使這n個數方差最小。input 第1行 2個數m,n,m n,m 10000 第2 m 1行 m個數的具體值 ...