互斥的數(codevs 1553)

2022-05-14 16:30:17 字數 1429 閱讀 3967

題目描述 description

有這樣的乙個集合,集合中的元素個數由給定的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

/*

改了兩個小時,把int改成long long 就對了,我暈……

做法:由於對於每個數,和它互斥的數只有乙個,所以可以找到和它互斥的數,然後建一條邊,

建邊式統計入度,這樣很多點就會成為一條鏈。對於每條鏈,如果它有tot個節點,我們

最多能取 (tot-1)/2 個點,統計總點數。

*/#include

#include

#include

#include

#define ll long long

#define m 100010

using

namespace

std;

ll n,p,a[m],

in[m],tot;

vector

grap[m];

void dfs(int

x)int

main()

ll ans=0

;

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

if(!in

[i])

cout

<

return0;

}

view code1

/*

另一種做法 hash

*/#include

#include

#include

#define mod 1358717

#define m 100010

#define ll long long

using

namespace

std;

ll head[mod+10

],a[m],n,m,cnt;

struct

node

;node e[m];

void

add(ll x,ll v)

bool

find(ll x,ll v)

intmain()

cout

<

return0;

}

view code2

CODEVS 1553 互斥的數

有這樣的乙個集合,集合中的元素個數由給定的n決定,集合的元素為n個不同的正整數,一旦集合中的兩個數x,y滿足y p x,那麼就認為x,y這兩個數是互斥的,現在想知道給定的乙個集合的最大子集滿足兩兩之間不互斥。輸入有多組資料,每組第一行給定兩個數n和p 1 n 10 5,1 p 10 9 接下來一行包...

codevs 1553 互斥的數

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

1553 互斥的數

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