嘟嘟嘟
這題真的有點神。
首先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 個鍵轉...