SDOI2019移動金幣 博弈論

2022-06-30 06:42:14 字數 901 閱讀 2479

題意簡述:在乙個\(1*n\)的棋盤上,有\(m\)個棋子.小\(a\),小\(b\)每次可以把乙個棋子向左移動若干格,但不能越過其他棋子.第乙個無法操作的人輸.問給定\(n,m\),有多少種局面使得\(小a\)必勝

\(n \leq 150000,m \leq 50\)

/*[sdoi2019]移動金幣*/

#includeusing namespace std;

#define ll long long

int read()

int n,m;

int t;

const int n = 3e5 + 10;

int dp[21][n];

int fac[n],invfac[n];

const int mod = 1e9 + 9;

#define t 19

int qpow(int x,int y)

return ans;

}void add(int &x,int y)

int c(int x,int y)

int calc(int bit,int s)

if(s < 0) return 0;

if(dp[bit][s] != -1) return dp[bit][s];

dp[bit][s] = 0;

for(int i = 0; i <= t; i += 2)

return dp[bit][s];

}int main()

ans = (1ll * fac[n] * invfac[m] % mod * invfac[n-m] % mod - ans + mod) % mod;

printf("%d\n",ans);

return 0;

}

移動金幣 SDOI2019

乙個 1 times n 的棋盤上最初擺放有 m 枚金幣。其中每一枚金幣佔據了乙個獨立的格仔,任意乙個格仔內最多只有一枚金幣。alice 和 bob 將要進行如下的一場遊戲。二人輪流操作,且 alice 先行。當輪到乙個玩家的時候,他可以選擇一枚金幣,並將其向左移動任意多格,且至少移動一格。金幣不能...

SDOI 2019 移動金幣 題解

題目傳送門 題目大意 乙個長度為 n nn 的序列上有 m mm 個金幣,兩個人輪流操作,乙個人可以將乙個金幣向左移動任意格,但是不能越過別的金幣,問有多少種局面先手必勝。感覺像這兩題 1,2 的合體,不過合的也很巧妙。轉化一下這個博弈 相當於有 m 1 m 1m 1 堆石子,每次可以將一堆石子中的...

SDOI 2019 快速查詢

傳送門 day1 t1 給定乙個長度為 n nn 的整數數列 有 q qq 次操作,操作有 6 66 種,分別為 單點賦值,全域性加,全域性乘,全域性賦值,單點查值,全域性求和。操作的讀入有點鬼畜啊,建議仔細讀一下。資料範圍 1 n 109 1 n 10 9 1 n 10 9,1 q 10 71 l...