某巨魔有一風扇,長得和下圖乙個慫樣。
這風扇原來有
n 個等分葉片,順時針編號 1到
n (誰是編號
1這不重要)。
任意兩個相鄰的葉片間隔相等,大小質地相同。
這個 n
滿足 n=
pa∗q
b,p ,
q為質數,
a ,
b為自然數。
風扇一開始還不錯,但是到後來風扇開始報復社會了。
它的葉片從窗戶甩了出去甩到了大街上,砸腫了二胖(二胖以前身材很好,你懂得)。
風扇的葉片脫落是很危險的,因為這會使風扇失去平衡。
可能當你經過風扇下方時它就直接拿你一血。
但是左圖風扇是平衡的,因為他的重心在風扇的正中心(至於為什麼自己想吧)。
現在給你一爛風扇。
需要你判斷它平不平衡,如果不平衡,那麼判斷它最少要拆掉它的多少葉片才能平衡。
第一行兩個數字
n ,
m,表示該風扇原來有
n 個葉片現在已經脫落了
m個葉片。
接下來
m 行,每行乙個數字,表示脫落的葉片編號,按公升序給出。
乙個數字,表示為使電風扇平衡所需要拆掉的葉片的最少數量。
12 5拆完後就是上圖那慫電風扇。30%1 4
5 9
10
的資料: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 的下界 ...
我已經不想寫演算法了
終於可以在辦公室寫程式了 但是回來卻比以前累了 又到一年招聘時,部落格上好多 面經 宛如昨日。缺少大型專案經驗,缺乏 實踐,課程學習不紮實,不熟練,都可能導致在面試中被刷掉。當然,這裡的邏輯是,第一等的學習成績還是必殺的。又一次湧起學演算法的衝動。大量的現有開源專案閱讀 學習 二次開發,專案的設計思...
我已經不想寫演算法了
終於可以在辦公室寫程式了 但是回來卻比以前累了 又到一年招聘時,部落格上好多 面經 宛如昨日。缺少大型專案經驗,缺乏 實踐,課程學習不紮實,不熟練,都可能導致在面試中被刷掉。當然,這裡的邏輯是,第一等的學習成績還是必殺的。又一次湧起學演算法的衝動。大量的現有開源專案閱讀 學習 二次開發,專案的設計思...