[BZOJ 4550: 小奇的博弈]knim+背包

%%% HZWER,感觉博弈里面的各种结论好多好自闭啊orz

4550: 小奇的博弈

Time Limit: 2 Sec Memory Limit: 256 MB Submit: 207 Solved: 126 [Submit][Status][Discuss]

Description

这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色。最左边是白色棋子,最右边 是黑色棋子,相邻的棋子颜色不同。 小奇可以移动白色棋子,提比可以移动黑色的棋子,它们每次操作可以移动1到d个棋子。每当移动某一个棋子时, 这个棋子不能跨越两边的棋子,当然也不可以出界。当谁不可以操作时,谁就失败了。小奇和提比轮流操作,现在 小奇先移动,有多少种初始棋子的布局会使它有必胜策略?

Input

共一行,三个数,n,k,d。对于100%的数据,有1<=d<=k<=n<=10000, k为偶数,k<=100。

Output

输出小奇胜利的方案总数。答案对1000000007取模。

Sample Input

10 4 2

Sample Output

182

HINT

Source

By Hzwer 我们发现对于白棋子如果往左移动一定会使自己更容易陷入死局,黑棋右移同理,所以默认白棋向右,黑棋向左,这样我们发现我们就分出了k/2堆石子,就是每次选择1-d堆石子的nim游戏. 对于knim游戏,有一个结论就是对于每一堆石子的sg的和的每一个二进制位上的总和都为d+1的倍数.考虑特殊的1nim游戏(即多堆,每次只能拿一堆),异或就是不进位%2. 转换模型之后背包f[i][x]表示二进制枚举到i,用x颗石子的方案数.由于对于每堆上面的一个二进制只能填0/1,转移套个组合数表示将这些(1<<i)k(d+1)个石子用在哪k*(d+1)堆石子中.然后最后统计答案再组合数考虑这些石子堆放的位置.
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod = 1e9+7;
const int maxn = 1e4+5;
int add(int x,int y) { x+=y; return x>=mod?x-mod:x; }
int sub(int x,int y) { x-=y; return x<0?x+mod:x; }
int mul(int x,int y) { return 1ll*x*y%mod; }
int ksm(int a,int b) {
    int ans = 1;
    for(;b;b>>=1,a=mul(a,a))
        if(b&1) ans = mul(ans,a);
    return ans;
}
int n,k,d;
int fac[maxn],inv[maxn];
int GC(int x,int y) { if(x<y) return 0; return mul(fac[x],mul(inv[x-y],inv[y])); }
int f[17][maxn];
int main() {
    scanf("%d%d%d",&n,&k,&d);
    fac[0] = 1; for(int i=1;i<=n;i++) fac[i] = mul(fac[i-1],i);
    inv[n] = ksm(fac[n],mod-2);
    for(int i=n-1;i>=0;i--) inv[i] = mul(inv[i+1],i+1);
    f[0][0] = 1;
    for(int s=0;s<16;s++) {
        for(int j=n-k;j>=0;j--) {
            for(int i=0; ( i*(d+1)*(1<<s)<=j ) && ( (d+1)*i<=(k>>1) ) ;i++) {
                f[s+1][j] = add(f[s+1][j], mul(f[s][j-i*(d+1)*(1<<s)],GC(k>>1,(d+1)*i)) );
            }
        }
    }
    int ans = 0;
    for(int i=0;i<=n-k;i++) {
        ans = add(ans,mul(f[16][i],GC(n-i-(k>>1),k>>1)));
    }
    printf("%d",sub(GC(n,k),ans));
}
posted @ 2019-01-21 19:52  Newuser233  阅读(24)  评论(0编辑  收藏  举报