六省聯考2017 分手是祝願

2022-05-09 10:54:15 字數 1376 閱讀 2729

嘟嘟嘟

這題真的有點神。

首先50分是送的,對於所有\(n = k\)的情況,直接從後往前掃一遍,碰到一盞燈亮著,就\(o(\sqrt n)\)操作一次。複雜度上界\(o(n \sqrt n)\),但根本達不到。

接著我就想不出來了,題解看了好多篇才懂。

首先要觀察出來的是,第\(i\)個開關的操作只會影響小於等於\(i\)的燈。且對於這個開關的操作,是其他開關替代不了的,因為每乙個數的約數都不相同。

所以我們可以先求出來對於初始狀態應該要按哪些開關。

這樣就可以dp了。

令dp[i]表示需要正確的按\(i\)次開關需要的期望步數,那麼考慮這一次能否按到正確的開關上:

\[dp[i] = \frac + (1 - \frac) * (1 + dp[i + 1] + dp[i])

\]前一項是按對了;後一項是按錯了,所以除了這一次的操作,就變成了需要按\(dp[i + 1]\)次,按完後又需要按\(dp[i]\)次。

然後移個項

\[dp[i] = \frac + \frac dp[i + 1]

\]於是答案就是\(n! * (k + \sum_ ^ dp[i])\)。\(cnt\)表示對於初始狀態,需要按\(cnt\)次。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 1e5 + 5;

const int mod = 1e5 + 3;

inline ll read()

inline void write(ll x)

int n, k;

bool a[maxn];

ll inv[maxn], dp[maxn], ans = 0;

in void change(int n)

}in int solve()

int main()

for(int i = 1; i <= n; ++i) ans = ans * i % mod;

write(ans), enter;

return 0;

}

六省聯考2017 分手是祝願

展開 題目描述 zeit und raum trennen dich und mich.時空將你我分開。b 君在玩乙個遊戲,這個遊戲由 nn 個燈和 nn 個開關組成,給定這 nn 個燈的初始狀態,下標為從 11 到 nn 的正整數。每個燈有兩個狀態亮和滅,我們用 11 來表示這個燈是亮的,用 00...

六省聯考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 個鍵轉...