博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj4550】小奇的博弈 博弈论+dp
阅读量:4678 次
发布时间:2019-06-09

本文共 1138 字,大约阅读时间需要 3 分钟。

题目描述

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

输入

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

输出

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

样例输入

10 4 2

样例输出

182


题解

博弈论+dp

我们去  吧

#include 
#include
#define mod 1000000007typedef long long ll;ll c[10010][110] , f[16][10010];int main(){ int n , m , d , i , j , k; ll ans = 0; scanf("%d%d%d" , &n , &m , &d) , d ++ ; c[0][0] = 1; for(i = 1 ; i <= n ; i ++ ) { c[i][0] = 1; for(j = 1 ; j <= m ; j ++ ) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod; } f[0][0] = 1; for(i = 1 ; d * (1 << (i - 1)) <= n - m ; i ++ ) for(j = 0 ; j <= n - m ; j ++ ) for(k = 0 ; k * (1 << (i - 1)) <= j && k <= (m >> 1) ; k += d) f[i][j] = (f[i][j] + f[i - 1][j - k * (1 << (i - 1))] * c[m >> 1][k]) % mod; for(j = 0 ; j <= n - m ; j ++ ) ans = (ans + f[i - 1][j] * c[n - (m >> 1) - j][m >> 1]) % mod; printf("%lld\n" , (c[n][m] - ans + mod) % mod); return 0;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/8059425.html

你可能感兴趣的文章
c++primer 第l六章编程练习答案
查看>>
上海秋季HCC小记
查看>>
Illustrator 上色
查看>>
truncate表恢复
查看>>
this关键字的使用
查看>>
Console.Read()、Console.ReadLine()、Console.ReadKey()
查看>>
ecere 编译过程中遇到的问题
查看>>
Cyclone V 与 Avalon-MM资料整理——DE1-SOC学习笔记(1)
查看>>
异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.
查看>>
Flask-SQLAlchemy
查看>>
C# - Generics
查看>>
.NET LINQ 转换数据类型
查看>>
[LGP2791] 幼儿园篮球题
查看>>
170. Two Sum III - Data structure design
查看>>
os & sys
查看>>
Shell 常用命令总结
查看>>
vector
查看>>
用分布式缓存提升ASP.NET Core性能
查看>>
《数据结构》相关题目
查看>>
Codeforces Round #431 (Div. 2) A 水 B 暴力模拟 C 思维
查看>>