bzoj4872 分手是祝願

2022-08-20 04:36:10 字數 1847 閱讀 4144

zeit und raum trennen dich und mich.

時空將你我分開。b 君在玩乙個遊戲,這個遊戲由 n 個燈和 n 個開關組成,給定這 n 個燈的初始狀態,下標為

從 1 到 n 的正整數。每個燈有兩個狀態亮和滅,我們用 1 來表示這個燈是亮的,用 0 表示這個燈是滅的,遊戲

的目標是使所有燈都滅掉。但是當操作第 i 個開關時,所有編號為 i 的約數(包括 1 和 i)的燈的狀態都會被

改變,即從亮變成滅,或者是從滅變成亮。b 君發現這個遊戲很難,於是想到了這樣的乙個策略,每次等概率隨機

操作乙個開關,直到所有燈都滅掉。這個策略需要的操作次數很多, b 君想到這樣的乙個優化。如果當前局面,

可以通過操作小於等於 k 個開關使所有燈都滅掉,那麼他將不再隨機,直接選擇操作次數最小的操作方法(這個

策略顯然小於等於 k 步)操作這些開關。b 君想知道按照這個策略(也就是先隨機操作,最後小於等於 k 步,使

用操作次數最小的操作方法)的操作次數的期望。這個期望可能很大,但是 b 君發現這個期望乘以 n 的階乘一定

是整數,所以他只需要知道這個整數對 100003 取模之後的結果。

第一行兩個整數 n, k。

接下來一行 n 個整數,每個整數是 0 或者 1,其中第 i 個整數表示第 i 個燈的初始情況。

1 ≤ n ≤ 100000, 0 ≤ k ≤ n;

輸出一行,為操作次數的期望乘以 n 的階乘對 100003 取模之後的結果。

4 00 0 1 1

512想法題

發現只有且只有一種熄滅方法使所有燈全滅

然後瞎**dp一下就好了

//

%std

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lovelive long long

#define lc son[x][0]

#define rc son[x][1]

#define lowbit(x) (x&(-x))

#define pt vc

const lovelive mod=100003

; const

int n=1e5+100

;void read(lovelive &x)

while(c>='

0'&&c<='9'

) x*=p;

}lovelive pow1(lovelive x,lovelive k)

returnr;}

lovelive f[n],d[n];

intmain()

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

jc=(jc*i)%mod;

for(int i=1;i<=k;i++)

f[i]=1;

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

f[i]=f[i-1]+f[i]%mod;

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

f[i]=f[i]*jc%mod;

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

read(d[i]);

for(int i=n;i>=1;i--)

if(d[i])

}cout

; return0;

}/*2 01 1

*/

view code

BZOJ4872 分手是祝願

有n 個燈,每個燈有兩個狀態亮和滅,我們用 1 來表示這個燈是亮的,用 0 表示這個燈是滅的,操作第 i 個開關時,所有編號為 i 的約數 包括 1 和 i 的燈的狀態都會被改變,即從亮變成滅,或者是從滅變成亮。b 可以通過操作小於等於 k 個開關使所有燈都滅掉,那麼他將不再隨機,直接選擇操作次數最...

4872 Shoi2017 分手是祝願

4872 shoi2017 分手是祝願 time limit 20 sec memory limit 512 mb submit 153 solved 109 submit status discuss description zeit und raum trennen dich und mich....

bzoj 4872 Shoi2017 分手是祝願

4872 shoi2017 分手是祝願 time limit 20 sec memory limit 512 mb submit 138 solved 97 submit status discuss description zeit und raum trennen dich und mich.時...