Codeforces Round #369 (div.2) 即 Codeforces 711
CodeForces Round #369 (div.2) Descreption
A
有N排座位,每排有4個,這4個被分成了兩組。給出每個座位是否是空的,問是否有相鄰的座位。
B
給你一個N * N的幻方,其中缺了一個格子,要求你填上。
C
有N個點M種顏色,有些點沒有顏色。給出了每個點分別染色成每種顏色的代價,要求染色後顏色的段數等於K。求最小代價。
D
有N個點,每個點有一條出邊,你可以任意轉換邊的方向。問有多少種方案,使得整個圖沒有環。
E
一年有2 ^ N天,有K個人。問有兩個人生日在同一天的概率。請輸出最簡分數,同時最簡分數的分子分母還要取模。
CodeForces Round #369 (div.2) Solutions
A
直接檢查即可,注意字串的讀入。
B
任取一個已經填滿的行,算出和,求出空白,再驗證:
- 行,列,主對角線的和是否一樣。
- N是否為1。
- 答案是否為負數。
C
一個顯然的DP。對於每個點只需要紀錄兩個狀態:該點的顏色、從1到該點的顏色段數。轉移時只要列舉下一個點的顏色(如果未確定),再判斷顏色段數是否增加(即是否和當前顏色一樣)即可。複雜度O(N ^ 4).
優化:
D
- 首先可以看出這個圖是一個環套樹的森林。(瞭解一下環套樹的概念)
- 考慮一個環套樹:對於一個無向環,只有兩種反轉會使得他變成一個有向環。對於不在環上的邊,是否取反顯然無關。那麼這個環套樹的方案即(2 ^ M - 2) * 2 ^ (N - M),其中N是環套樹的點數,M是環的大小。
- 不同的連通塊的答案顯然可以相乘。
E
這個題的答案是一個顯然且經典的問題。設一年有N天,一共有K個人,那麼所有人的生日都不在同一天的概率(即答案的補)為(N - 1) * (N - 2) * … * (N - K + 1) / N ^ K. 詳細證明見《演算法導論5.4.1》。
接下來的任務是約分。因為天數是2 ^ N,所以只用計算分子中有多少個2即可。觀察下分子,發現分子中2的個數和-1 to -K + 1中的個數一樣,即和1 to K - 1中的個數一樣。統計1 to K - 1中2的個數是個十分簡單的問題,分別計算2的冪的出現次數並求和即可。
最後要對分子和分母取模。分母取模是一個快速冪的事情。觀察到模數特別小,而分子是一段連續數的連乘,且約去的數只有2(因為2和Mod互質,所以不用擔心Mod的倍數除2後不再是Mod的倍數)。所以當K超過Mod時必然有Mod的倍數出現,那麼取模後等於0。若K不超過Mod即K不超過1000003,暴力計算即可。
當然別忘了取補。