展開
題目描述
zeit und raum trennen dich und mich. 時空將你我分開。
b 君在玩乙個遊戲,這個遊戲由 nn 個燈和 nn 個開關組成,給定這 nn 個燈的初始狀態,下標為從 11 到 nn 的正整數。
每個燈有兩個狀態亮和滅,我們用 11 來表示這個燈是亮的,用 00 表示這個燈是滅的,遊戲的目標是使所有燈都滅掉。
但是當操作第 ii 個開關時,所有編號為 ii 的約數(包括 11 和 ii)的燈的狀態都會被改變,即從亮變成滅,或者是從滅變成亮。
b 君發現這個遊戲很難,於是想到了這樣的乙個策略,每次等概率隨機操作乙個開關,直到所有燈都滅掉。
這個策略需要的操作次數很多,b 君想到這樣的乙個優化。如果當前局面,可以通過操作小於等於 kk 個開關使所有燈都滅掉,那麼他將不再隨機,直接選擇操作次數最小的操作方法(這個策略顯然小於等於 kk 步)操作這些開關。
b 君想知道按照這個策略(也就是先隨機操作,最後小於等於 kk 步,使用操作次數最小的操作方法)的操作次數的期望。
這個期望可能很大,但是 b 君發現這個期望乘以 nn 的階乘一定是整數,所以他只需要知道這個整數對 100003100003 取模之後的結果。
輸入格式
第一行兩個整數 n, kn,k。 接下來一行 nn 個整數,每個整數是 00 或者 11,其中第 ii 個整數表示第 ii 個燈的初始情況。
輸出格式
輸出一行,為操作次數的期望乘以 nn 的階乘對 100003100003 取模之後的結果。
輸入輸出樣例
輸入 #1複製
4 00 0 1 1
輸出 #1複製
512輸入 #2複製
5 01 0 1 1 1
輸出 #2複製
5120
說明/提示
對於 0%0% 的測試點,和樣例一模一樣;
對於另外 30%30% 的測試點,n \leq 10n≤10;
對於另外 20%20% 的測試點,n \leq 100n≤100;
對於另外 30%30% 的測試點,n \leq 1000n≤1000;
對於 100%100% 的測試點,1 \leq n \leq 100000, 0 \leq k \leq n1≤n≤100000,0≤k≤n;
對於以上每部分測試點,均有一半的資料滿足 k = nk=n。
考慮期望,設f[i]表示從有i個正確選擇變為有i-1個正確選擇的期望操作次數,f[i
]=in
+(1−
in)∗
(1+f
[i+1
]+f[
i]
)f[i]=\dfrac+(1-\dfrac)*(1+f[i+1]+f[i])
f[i]=n
i+(
1−ni
)∗(
1+f[
i+1]
+f[i
])(n個開關,i個正確,其他n-i個會增加乙個錯誤,需f[n+1]+f[n]次操作變到i-1)
移項f [i
]=1+
(1∗n
−i)∗
(f[i
+1]+
1)
if[i]=1+\dfrac
f[i]=1
+i(1
∗n−i
)∗(f
[i+1
]+1)
,f[n] = 1,把f累加一下就可以。
不要忘了乘n!n!
n!
#include
#include
#include
using
namespace std;
typedef
long
long ll;
inline
void
read
(int
&x)typedef
long
long ll;
const
int p =
100003
;int n,k,b[
101000];
ll f[
101000
],inv[
101000];
vector<
int> g[
101000];
void
work()
if(tp <= k) ans = tp;
else
for(
int i =
1; i <= n; i++
) ans =
(ans*i)
%p;printf
("%lld"
,ans);}
intmain()
六省聯考2017 分手是祝願
嘟嘟嘟 這題真的有點神。首先50分是送的,對於所有 n k 的情況,直接從後往前掃一遍,碰到一盞燈亮著,就 o sqrt n 操作一次。複雜度上界 o n sqrt n 但根本達不到。接著我就想不出來了,題解看了好多篇才懂。首先要觀察出來的是,第 i 個開關的操作只會影響小於等於 i 的燈。且對於這...
六省聯考2017 分手是祝願 期望DP
略 先考慮初始狀態滅掉所有燈的最小次數 cnt 可以從大到小貪心求出。因為每個燈只能被比它大的更新,可以直接從大到小,遇到開的就按滅,同時操作它的約數。複雜度 o n log n 如果 cnt leq k 那麼只需要初始時按最小次數操作即可,輸出 n cdot cnt 否則需要期望dp.容易發現,每...
Luogu3750 六省聯考2017 分手是祝願
運用貪心的策略,如果我們想要盡快關閉所有的燈,顯然從編號大的到編號小的關更優 那麼我們可以計算出關燈的最小次數 cnt 如果 cnt le k 顯然答案就是 cnt 如果 cnt k 我們考慮 dp 由於不同的鍵的效果是互不相同的,不存在乙個鍵被代替的情況 設 dp i 表示從最少需要按 i 個鍵轉...