六省聯考2017 分手是祝願

2021-10-05 13:03:37 字數 2364 閱讀 3604

展開

題目描述

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 個鍵轉...