我真的不想寫背景

2021-07-14 12:39:03 字數 3960 閱讀 2385

某巨魔有一風扇,長得和下圖乙個慫樣。

這風扇原來有

n 個等分葉片,順時針編號 1到

n (誰是編號

1這不重要)。

任意兩個相鄰的葉片間隔相等,大小質地相同。

這個 n

滿足 n=

pa∗q

b,p ,

q為質數,

a ,

b為自然數。

風扇一開始還不錯,但是到後來風扇開始報復社會了。

它的葉片從窗戶甩了出去甩到了大街上,砸腫了二胖(二胖以前身材很好,你懂得)。

風扇的葉片脫落是很危險的,因為這會使風扇失去平衡。

可能當你經過風扇下方時它就直接拿你一血。

但是左圖風扇是平衡的,因為他的重心在風扇的正中心(至於為什麼自己想吧)。

現在給你一爛風扇。

需要你判斷它平不平衡,如果不平衡,那麼判斷它最少要拆掉它的多少葉片才能平衡。

第一行兩個數字

n ,

m,表示該風扇原來有

n 個葉片現在已經脫落了

m個葉片。

接下來

m 行,每行乙個數字,表示脫落的葉片編號,按公升序給出。

乙個數字,表示為使電風扇平衡所需要拆掉的葉片的最少數量。

12 5

1 4

5 9

10

拆完後就是上圖那慫電風扇。30%

的資料:1≤

n≤10 。 50%

的資料:1≤

n≤10000

。 100%

的資料:1≤

n≤2∗

106,m≤n

。首先,圖中這個風扇為什麼平衡成了一大問題,搞出了這個那麼這個題就簡單了(蒟蒻我是想了很久很久很久很久……)

因為一對對稱的風扇葉肯定是平衡的,如果把它們拿掉也不影響風扇的平衡性。

於是……我就把所有對稱的風扇葉拿掉了。

於是乎變成了下面這個圖:

這是個三等分的風扇,肯定是對稱的。

所以原風扇是平衡的………

所以,我們就要在乙個風扇中,找到乙個質數

k ,使得這

n個扇葉中,存在乙個

k 等分的組合。

那麼,n

肯定是

k 的倍數,而

k又是質數,所以 k=

p 或

q 。

列出所有等分的風扇。

p等分的風扇:

風扇序號

第乙個扇葉

第二個扇葉

第三個扇葉

第四個扇葉

……最後乙個扇葉

風扇11+n

p 1+

2np 1+

3np 1+

4np 1+

(p−1

)np

風扇22+n

p 2+

2np 2+

3np 2+

4np 2+

(p−1

)np

風扇33+n

p 3+

2np 3+

3np 3+

4np 3+

(p−1

)np

……風扇np

np+n

p np

+2np

np+3np

np+4np

n

q等分的扇葉:

風扇序號

第乙個扇葉

第二個扇葉

第三個扇葉

第四個扇葉

……最後乙個扇葉

風扇11+n

q 1+

2nq 1+

3nq 1+

4nq 1+

(q−1

)nq

風扇22+n

q 2+

2nq 2+

3nq 2+

4nq 2+

(q−1

)nq

風扇33+n

q 3+

2nq 3+

3nq 3+

4nq 3+

(q−1

)nq

……風扇nq

nq+n

q nq

+2nq

nq+3nq

nq+4nq

n

注意到所有

p等分的風扇互不相交,所有

q 等分的風扇也互不相交。

新建乙個源點,向每乙個

p等分的風扇連一條容量為

p 的邊;

新建乙個匯點,每乙個

q等分的風扇向匯點連一條容量為

q 的邊;

若某個

p等分的風扇與某個

q 等分的風扇中有乙個或幾個扇葉相同,則從這乙個

p等分的風扇連一條容量為 in

f 的邊到這乙個

q 等分的風扇。

要求最少拿去多少個扇葉能使其平衡,等價於拿去若干個等分的風扇,使得剩下來的扇葉最少。

因為乙個扇葉顯然只能放在乙個風扇中被拿走,所以問題等價於求我們建的圖的最小割的補集。

求出最大流即可。

#include 

#include

#include

#include

#define min(x,y) ((x)

#define s 0

#define t 2000005

#define inf 0x3f3f3f3f

using

namespace

std;

int n,m,p,q,tot,cnt;

bool w[2000010];

bool vis[2000010];

int in[2000010];

int head[2000010],nxt[8000010],data[8000010],flow[8000010],dis[2000010];

int cur[2000010];

queue

qs;void add(int x,int y,int z)

bool bfs()

}return dis[t]!=-1;

}int dinic(int now,int flow)

}return0;}

int main()

bool first=true;

int sqr=sqrt(n);

for(int i=2;i<=sqr;i++)

if(n%i==0&&first)

else

if(n%i==0)

if(n!=1)q=n;n=tn;

for(int i=1;i<=n/p;i++)if(!w[i])

nxt:;

}for(int i=1;i<=n/q;i++)if(!w[i])

}add(tot,t,q);

nxt2:;

}while(bfs())

}printf("%d\n",n-m-maxn);

return

0;}

我真不想寫背景

某巨魔突然對等式很感興趣,他正在研究 a1 x1 a 2x2 an xn b 存在非負整數解的條件。他要求你編寫乙個程式,給定 n an 以及 b 的取值範圍,求出有多少 b可以使等式存在非負整數解。輸入的第一行包含 3 個正整數,分別表示 n bmin bma x 分別表示數列的長度 b 的下界 ...

我已經不想寫演算法了

終於可以在辦公室寫程式了 但是回來卻比以前累了 又到一年招聘時,部落格上好多 面經 宛如昨日。缺少大型專案經驗,缺乏 實踐,課程學習不紮實,不熟練,都可能導致在面試中被刷掉。當然,這裡的邏輯是,第一等的學習成績還是必殺的。又一次湧起學演算法的衝動。大量的現有開源專案閱讀 學習 二次開發,專案的設計思...

我已經不想寫演算法了

終於可以在辦公室寫程式了 但是回來卻比以前累了 又到一年招聘時,部落格上好多 面經 宛如昨日。缺少大型專案經驗,缺乏 實踐,課程學習不紮實,不熟練,都可能導致在面試中被刷掉。當然,這裡的邏輯是,第一等的學習成績還是必殺的。又一次湧起學演算法的衝動。大量的現有開源專案閱讀 學習 二次開發,專案的設計思...