Description

黑白棋(game
【问题描述】
小A和小B又想到了一个新的游戏。
这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色。
最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同。
E
小A可以移动白色棋子,小B可以移动黑色的棋子,他们每次操作可以移动1到d个棋子。
每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界。当谁不可以操作时,谁就失败了。
小A和小B轮流操作,现在小A先移动,有多少种初始棋子的布局会使他胜利呢?

Input

共一行,三个数,n,k,d。

Output

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

Sample Input

10 4 2

Sample Output

182
【数据规模和约定】

对于100%的数据,有1<=d<=k<=n<=10000, k为偶数,k<=100。

HINT

Source

stage 2 day1

【分析】

很经典的题目,很不错。

我们将相邻的棋子看成一对,显然,在最后的情况下,每对棋子都是紧贴在一起的。

对于每对棋子,白棋在左边,黑棋在右边,那么白棋就只能往右边走,黑棋也只能往左边走,否则若白棋往左边,黑棋也可以往左边,情况不会有改变。

那么若将每对棋子之间的距离看成一堆石子的数量,就变成经典的nim游戏。

然后用nimk的理论做就行了。

DP有点难想...看代码就看得懂了

 /*
唐代白居易
《问刘十九》
绿蚁新醅酒,红泥小火炉。
晚来天欲雪,能饮一杯无。*/ #include <set>
#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define LOCAL
const int MAXL = ;
const long long MOD = ;
const int MAXK = + ;
const int MAXN = + ;
using namespace std;
typedef long long ll;
ll f[][MAXN * ];
ll c[MAXK][], n, K, d; ll C(ll a, ll b){
if (a == b) return 1ll;
//if (b > a - b) b = a - b;
return c[a][b] % MOD;
}
void prepare(){//预处理组合数
memset(c, , sizeof(c));
c[][] = ;
for (ll i = ; i <= 10005ll; i++){
c[i][] = 1ll;
//if (i <= 210) c[i][i] = 1;
for (ll j = ; j < min(i, 250ll); j++)
c[i][j] = (C(i - , j) + C(i - , j - )) % MOD;
}
//for (ll i = 1; i <= 50; i++)
//for (ll j = 0; j <= i; j++) printf("%d %d:%d\n", i, j, C[i][j]);
//printf("%d\n", C[10][2]);
}
void dp(){
K /= ;
memset(f, , sizeof(f));
f[][] = ;//第0位
for (ll i = ; i <= ; i++){
for (ll j = ; j <= n - * K; j++)//注意这一层不需要枚举到n了,因为只有这么多的空位
for (ll k = ; (k * (d + ) <= K) && (k * (d + ) * (1ll<<(i - )) <= j); k++){
f[i][j] = (f[i][j] + (f[i - ][j - k * (d + ) * (1ll<<(i - ))] * C(K, k * (d + ))) % MOD) % MOD; }
}
ll Ans = ;
for (ll i = ; i <= n - * K; i++) Ans = (Ans + (f[][i] * C(n - i - K * + K, K)) % MOD) % MOD;
printf("%lld\n", (C(n, * K) - Ans + MOD) % MOD);
} int main(){ prepare();
scanf("%lld%lld%lld", &n, &K, &d);
dp();
//n的距离,k个石头,1~d次移动
return ;
}

【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋的更多相关文章

  1. 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)

    [BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...

  2. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][ ...

  3. Bzoj 2281 [Sdoi2011]黑白棋 题解

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 592  Solved: 362[Submit][Status][ ...

  4. P2490 [SDOI2011]黑白棋

    P2490 [SDOI2011]黑白棋 题意 一个 \(1*n\) 的棋盘上,A 可以移动白色棋子,B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右.他们每次操作可以移动 1 到 \(d\) 个 ...

  5. BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)

    题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...

  6. [SDOI2011]黑白棋

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  7. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  8. BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  9. BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏

    题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色 ...

随机推荐

  1. Linux Shell编程(14)——内部变量

    内建变量影响Bash脚本行为的变量.$BASHBash二进制程序文件的路径 bash$ echo $BASH /bin/bash$BASH_ENV该环境变量保存一个Bash启动文件路径,当启动一个脚本 ...

  2. Light OJ 1050 - Marbles(概率DP)

    题目大意: 一个包裹里有蓝色和红色的弹珠,在这个包裹里有奇数个弹珠,你先走, 你先从背包里随机的拿走一个弹珠,拿走每个弹珠的可能性是一样的.然后Jim从背包里拿走一个蓝色的弹珠,如果没有蓝色的弹珠让J ...

  3. (转载)JavaScript中定义变量

    (转载)http://blog.163.com/xuxiaoqianhz@126/blog/static/165190577201061594421870/ JavaScript中定义变量有两种方式: ...

  4. 每天进步一点点--JS中的getYear()

    又是这两天在项目中遇到的,或许很简单,但真实第一次遇到,记录一下. 在页面上用JS获取了一下当前的日期,并用getYear()方法返回了当前的年度,2013也没问题,代码在IE中都测试通过了之后就提交 ...

  5. xapian搜索系统存储结构解读

    Xapian的database是所有用于检索的信息表的集合,以下的表是必需的: posting list table 保存了被每一个term索引的document,实际上保存的应该是document在 ...

  6. 2 hive的使用 + hive的常用语法

    本博文的主要内容有: .hive的常用语法 .内部表 .外部表 .内部表,被drop掉,会发生什么? .外部表,被drop掉,会发生什么? .内部表和外部表的,保存的路径在哪? .用于创建一些临时表存 ...

  7. c#基础语言编程-装箱和拆箱

    引言 为什么有装箱和拆箱,两者起到什么作用?NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对 ...

  8. Android中的主题Theme

    系统自带的Theme: android以及为我们定义好了一些theme,需要是我们直接可以拿来使用. 常用的Theme通常如下:  android:theme="@android:style ...

  9. [置顶] Array ArrayList LinkList的区别剖析

    这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...

  10. nanosleep纳秒级延迟

    //函数原型 int nanosleep(struct timespec *req, struct timespec *rem) //参数列表: // req:要求的睡眠时间 // rem:剩余的睡眠 ...