互斥的數(hash)

2022-04-06 04:32:42 字數 1448 閱讀 8254

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

有這樣的乙個集合,集合中的元素個數由給定的n決定,集合的元素為n個不同的正整數,一旦集合中的兩個數x,y滿足y = p*x,那麼就認為x,y這兩個數是互斥的,現在想知道給定的乙個集合的最大子集滿足兩兩之間不互斥。

輸入描述 input description

輸入有多組資料,每組第一行給定兩個數n和p(1<=n<=10^5, 1<=p<=10^9)。接下來一行包含n個不同正整數ai(1<=ai<=10^9)。

輸出描述 output description

輸出一行表示最大的滿足要求的子集的元素個數。

樣例輸入 sample input

4 21 2 3 4

樣例輸出 sample output

3資料範圍及提示 data size & hint

//

雙雜湊

#include#include

#include

#define mod1 10007

#define mod2 10009

using

namespace

std;

intn,tot,p;

int a[1000010],b[10100][10100

];int

main()

sort(a+1,a+n+1

);

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

printf(

"%d\n

",tot);

return0;

}/*貪心思想+map實現

找出不互質的數的集合,就是把互斥的數刪去,那麼當有兩個互斥的數時,刪掉哪乙個呢?刪掉後面的。為什麼?當刪掉後面的數時,這個數前面的會入選,這個數後面的與它互斥的數也會入選,因為每個數都是不同的。

舉個例子:

3 2

1 2 4

當列舉到1時 會發現1和2有衝突

我們毫不猶豫的刪去2 這樣4才能也被選入

樣例2

4 2

1 2 4 8

當我們列舉到1時 還是發現1和2有衝突

還是刪去2 這樣4能被選入 而8必須被刪去

*/#include

#include

#include

using

namespace

std;

const

int maxn=100010

;int

n,m,ans,a[maxn];

maphash;

intmain()

cout

<

return0;

}

心若向陽,無言悲傷

Codevs 1533互斥的數 hash

題目大意 給定n個不同的數和p,要求選擇盡可能多的數,使得選擇的數中,任意兩個大的都不是小的p倍。數值 1e9。題解 首先排個序。然後從小到大考慮每個數字,如果當前數字沒有被 排斥 就cnt 並把它排斥的 即比他大的且是它p倍 數排斥走。最後cnt就是答案。如果不用map的話辣不就是hash麼。然而...

1553 互斥的數

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 description 有這樣的乙個集合,集合中的元素個數由給定的n決定,集合的元素為n個不同的正整數,一旦集合中的兩個數x,y滿足y p x,那麼就認為x,y這兩個數是互斥的,現在想知道給定的乙個集合的最大子集滿...

wikioi 1553 互斥的數

題目大意 給定n 和 p,規則 if x y p 那麼x 與 y 互斥。找出最大的集合,每個元素兩兩不互斥。思路 既然x p 和 y 互斥,那麼,如果有a i 滿足a i p 和 a i 互斥,就刪掉a i p。因為如果刪除a i p 會使a i p p 可以存在於集合中,所以刪a i p 一定不會...