略
先考慮初始狀態滅掉所有燈的最小次數\(cnt\),可以從大到小貪心求出。因為每個燈只能被比它大的更新,可以直接從大到小,遇到開的就按滅,同時操作它的約數。複雜度\(o(n\log n)\)
如果\(cnt \leq k\),那麼只需要初始時按最小次數操作即可,輸出\(n!\cdot cnt\)
否則需要期望dp.容易發現,每個開關都不能被其他開關的組合替代。設\(f_i\)表示把需要按\(i\)個正確的開關(可能有重複)來滅掉所有燈的狀態轉化為需要按\(i-1\)個正確的開關的期望次數。那麼有:
\[f_i=\frac+\frac(f_i+f_+1)
\]因為隨機選有可能操作\(i\)個正確的開關,也可能操作錯誤的開關,那麼就需要再按一次抵消這次操作,需要的開關數變成\(i+1\),再變回\(i\),因此加上\(f_i+f_\)
移項得到遞推方程,邊界\(f_n=1\)
\[f_i=1+\frac+1)}
\]最終答案\(n!(k+\sum_^ f_j)\)
#include#include#include#include#define mod 100003
#define maxn 100000
using namespace std;
typedef long long ll;
inline ll fast_pow(ll x,ll k)
return ans;
} inline ll inv(ll x)
int n,k;
vectord[maxn+5];
int a[maxn+5];
ll fact[maxn+5],invfact[maxn+5],invx[maxn+5];
ll dp[maxn+5];
void ini(int n)
int main()
int mina=0;//貪心得出的最小次數
for(int i=n;i>=1;i--)
} dp[n]=1;
for(int i=n-1;i>=1;i--)
if(mina<=k) printf("%lld\n",mina*fact[n]%mod);//初始局面的答案就<=k,直接操作
else
}
六省聯考2017 分手是祝願
展開 題目描述 zeit und raum trennen dich und mich.時空將你我分開。b 君在玩乙個遊戲,這個遊戲由 nn 個燈和 nn 個開關組成,給定這 nn 個燈的初始狀態,下標為從 11 到 nn 的正整數。每個燈有兩個狀態亮和滅,我們用 11 來表示這個燈是亮的,用 00...
六省聯考2017 分手是祝願
嘟嘟嘟 這題真的有點神。首先50分是送的,對於所有 n k 的情況,直接從後往前掃一遍,碰到一盞燈亮著,就 o sqrt n 操作一次。複雜度上界 o n sqrt n 但根本達不到。接著我就想不出來了,題解看了好多篇才懂。首先要觀察出來的是,第 i 個開關的操作只會影響小於等於 i 的燈。且對於這...
Luogu3750 六省聯考2017 分手是祝願
運用貪心的策略,如果我們想要盡快關閉所有的燈,顯然從編號大的到編號小的關更優 那麼我們可以計算出關燈的最小次數 cnt 如果 cnt le k 顯然答案就是 cnt 如果 cnt k 我們考慮 dp 由於不同的鍵的效果是互不相同的,不存在乙個鍵被代替的情況 設 dp i 表示從最少需要按 i 個鍵轉...