当前位置: 首页 > 编程日记 > 正文

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

Description

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

Input

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

Output

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

Sample Input

10 4 2

Sample Output

182

HINT

1<=d<=k<=n<=10000, k为偶数,k<=100。

Solution

我组合计数和$DP$真的是菜的真实……

首先这个题必须加一个限制条件:先手只能向右,后手只能向左,不然下面的做法会被黄学长找出来反例……?QAQ 不过还是能过的我也不知道为什么

首先比较容易发现,因为每个人操作的方向是一定的,所以可以把一对相邻的黑白棋中间的格子数看成一堆石子,那么这个就变成了一个有$k/2$堆的$Nim$游戏。只不过这个$Nim$游戏一次可以取$1 \sim d$堆,也就是$k-Nim$游戏。

$k-Nim$游戏的先手必败态是把每堆石子转换为二进制后,其中每一位上为1的个数和都能被$(d+1)$整除。

感性理解还是挺正确的……具体证明戳这里吧。

然后就可以开始$DP$了。设$f[i][j]$表示$DP$到了二进制的第$i$位,用了$j$个棋子的必败态方案数。

$f[i][j]= \sum f[i-1][j-l \times (d+1) \times 2^i]*C_{k/2}^{l \times (d+1)}$

(这一次用了$l \times (d+1) \times 2^i$个石子,乘组合数是因为从$k/2$堆石子里选出$k \times (d+1)$堆。)

最后答案为$C_n^k-\sum_{i=0}^{n-k}f[15][i] \times C_{n-k/2-i}^{k/2}$

(乘组合数是因为每对棋子在棋盘上的距离确定了,就差每对棋子的排列方式了。)

Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #define N (10009)
 4 #define LL long long
 5 #define MOD (1000000007)
 6 using namespace std;
 7 
 8 LL n,k,d,p[19],C[N][209],f[19][N];
 9 
10 void Init()
11 {
12     p[0]=1;
13     for (int i=1; i<=16; ++i) p[i]=p[i-1]<<1;
14     C[0][0]=1;
15     for (int i=1; i<=n; ++i)
16         for (int j=0; j<=min(2*k,(LL)i); ++j)
17         {
18             (C[i][j]+=C[i-1][j])%=MOD;
19             if (j) (C[i][j]+=C[i-1][j-1])%=MOD;
20         }
21 }
22 
23 int main()
24 {
25     scanf("%lld%lld%lld",&n,&k,&d);
26     Init();
27     f[0][0]=1;
28     for (int i=1; i<=15; ++i)
29         for (int j=0; j<=n-k; ++j)
30             for (int l=0; l*(d+1)<=k/2&&l*(d+1)*p[i-1]<=j; ++l)
31                 (f[i][j]+=f[i-1][j-l*(d+1)*p[i-1]]*C[k/2][l*(d+1)]%MOD)%=MOD;
32     LL ans=0;
33     for (int i=0; i<=n-k; ++i)
34         (ans+=f[15][i]*C[n-k/2-i][k/2]%MOD)%=MOD;
35     ans=(C[n][k]-ans+MOD)%MOD;
36     printf("%lld\n",ans);
37 }

转载于:https://www.cnblogs.com/refun/p/10105586.html

相关文章:

高性能微服务架构设计模式@霞落满天

高性能微服务架构设计模式 主讲&#xff1a;霞落满天 现在企业开发都是微服务架构&#xff0c;但是有很多问题&#xff0c;比如分布式定义&#xff0c;分布式的微服务怎么拆分&#xff0c;什么时候拆分&#xff0c;怎么做到高性能&#xff0c;中台怎么设计&#xff0c;读写分…

【数据结构】顺序栈的实现(C语言)

栈的基本概念及其描述 栈是一种特殊的线性表&#xff0c;规定它的插入运算和删除运算均在线性表的同一端进行&#xff0c;进行插入操作和删除操作的那一端称为栈顶&#xff0c;另一端称为栈底。 栈的插入操作和删除操作分别称为进栈和出栈。 FILO&#xff08;First In Last …

iOS绘制图片与文字

2019独角兽企业重金招聘Python工程师标准>>> #####绘制图片与文字 #####1.绘制图片&#xff0c;直接代码说明 加载图片 #pragma mark - 小黄人 -(void) drawImage:(CGRect) rect{UIImage *image[UIImage imageNamed:"黄人"];//图片有可能显示不全&#xf…

php-fpm慢执行日志

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容request_slowlog_timeout 1slowlog /usr/local/php-fpm/var/log/www-slow.log 测试&#xff1a;/usr/local/php-fpm/sbin/php-fpm -t/etc/init.d/php-fpm reloadls ../../var/log/ //生成日志php-fpm.log www-sl…

spring springboot springcloud常用注解

SpringBootApplication 组合注解&#xff0c;用在启动类上&#xff0c;源码&#xff1a; Retention(RetentionPolicy.RUNTIME) SpringBootConfiguration EnableAutoConfiguration ComponentScan public interface SpringBootApplication SpringBootConfiguration Configurat…

解决eclipse ctrl+鼠标左键不能用

选择【Window】菜单 Preferences ——>General——>Editors——>Text Editors——>Hyperlinking 把勾都点上,然后确定KEY 值为 crtl

【数据结构】顺序队列的实现(C语言)

队列的基本概念及其描述 队列是一种特殊的线性表&#xff0c;它的特殊性在于队列的插入和删除操作分别在表的两端进行。 插入的那一端称为队尾&#xff0c;删除的那一端称为队首。队列的插入操作和删除操作分别称为进队和出队。 先进先出&#xff08;First In First Out&…

ethereumjs/ethereumjs-vm-2-API文档

https://github.com/ethereumjs/ethereumjs-vm/blob/master/docs/index.md vm.runBlockchain Processes blocks and adds them to the blockchain 处理区块并将其添加到区块链中 Parameters输入参数 blockchain Blockchain A blockchain that to process 一个处理的区块链cb Fu…

qt 拖拽 修改大小(二)

最近项目需要实现windows下橡皮筋的效果&#xff0c;所以对此做了一些了解&#xff0c;特此记录。 首先windows系统是支持橡皮筋效果的&#xff0c;需要使用win32方 法&#xff1a;SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, showFullWindow, NULL, 0);showFullWindow是一个…

互联网大厂技术面试内幕@霞落满天

很多求职者往往并非因为技术不好&#xff0c;而是没有掌握面试的技巧导致不能把握机会&#xff0c;本课程的目的就是本课程先通过比较真实的好简历和不好的简历让大家明白自己的简历有哪些问题&#xff0c;事实上简历是大厂的敲门砖&#xff0c;非常重要&#xff0c;很多人得不…

【数据结构】顺序表的应用(1)(C语言)

问题&#xff1a; 1.将顺序表(a1,a2,…,an)重新排列以a1为界的两部分&#xff1a;a1前面的值均比a1小&#xff0c;a1后面的值均比a1大&#xff08;这里假设数据元素的类型具有可比性&#xff0c;不妨设为整型&#xff09;。 头文件与该头文件一样&#xff1a;【数据结构】顺序…

比特币寒冬中,你更应该关注企业区块链!

公众对区块链的认识也许限于比特币或以太坊&#xff0c;但很多却不知道 Hyperledger&#xff08;超级账本&#xff09;。Hyperledger Fabric&#xff0c;是由 IBM 带头发起的一个联盟链项目&#xff0c;2015 年末移交给 Linux 基金会&#xff0c;成为开源项目。Linux 基金会孵化…

JVM XMX设置多大比较好,Docke容器里该怎么设置JVM呢@无界编程

XMX是JVM的最大堆内存大小,XMS是JVM的初始堆内存大小。 不管是工作还是面试经常遇到一个问题就是XMX到底设置多大比较好? 网上的答案大多是说XMX和XMS设置为一样大,但是没有说到底XMX设置多大比较好。 如果设置为和操作系统一样大内存会怎么样? 这篇文章就带你搞清楚这…

【数据结构】顺序表的应用(2)(C语言)

问题&#xff1a; 2.有顺序表A和B&#xff0c;其元素均按从小到大的升序排列&#xff0c;编写一个算法&#xff0c;将它们合并成一个顺序表C&#xff0c;要求C的元素也按从小到大的升序排列。 头文件与该头文件一样&#xff1a;【数据结构】顺序表的实现&#xff08;C语言&am…

OWA登录页面显示为英文而不是中文

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包&#xff0c;QQ:185426445.电话18666943750故障描述&#xff1a;WIN10操作系统使用IE登录OWA的时候&#xff0c;界面语言为英文&#xff0c;WIN10操作系统为中文系统&#xff0c;区域语言都是设置为中文&…

java B2B2C springmvc mybatis多租户电子商城系统-Spring Cloud Feign

1、什么是Feign&#xff1f; 愿意了解源码的朋友直接企鹅求求&#xff1a;二一四七七七五六三三 Feign 的英文表意为“假装&#xff0c;伪装&#xff0c;变形”&#xff0c; 是一个http请求调用的轻量级框架&#xff0c;可以以Java接口注解的方式调用Http请求&#xff0c;而不用…

【数据结构】顺序表的应用(3)(C语言)

问题&#xff1a; 已知一个顺序表中的各节点值是从大到小有序的&#xff0c;设计一个算法&#xff0c;插入一个值为x的节点&#xff0c;使顺序表中的节点仍然是从小到大有序的。 头文件与该头文件一样&#xff1a;【数据结构】顺序表的实现&#xff08;C语言&#xff09; #i…

从源码和内核角度分析redis和nginx以及java NIO可以支持多大的并发

有人询问我网上一篇关于“redis为什么单线程这么快”的文章,我建议他不要看了,因为redis是单进程不是单线程,后面的意见不用看了,文章质量肯定不会很好,他也说了自己看了很久源码似乎还是有些云里雾里,所以我就给他分析了为什么redis这么快,这篇主要讲epoll的实现。 从…

背景图片等比缩放的写法background-size简写法

1、背景图片或图标也可像img一样给其宽高就能指定其缩放大小了。 比如一个实际宽高36*28的图标&#xff0c;要缩小一半引用进来的写法就是&#xff1a; background:rgba(0, 0, 0, 0) url("../images/report_icon2x.png") no-repeat scroll left center / 18px 14px; …

深入了解以太坊

正在看这篇文章的你&#xff0c;应该是一名被区块链技术所吸引的开发者或者极客。我相信你已经理解了区块链的技术原理&#xff0c;并急切地想要搞清楚这项技术将为你和你的开发技术栈带来怎样的影响。 如果你需要更基础的区块链技术介绍&#xff0c;可以阅读比特币和以太坊的白…

Netty和JDK源码来看Netty的NIO和JDK的NIO有什么不同

JDK底层提供了NIO实现,在Linux环境会调用内核epoll。 但是Netty通过JNI的方式提供了Native Socket Transport,为什么Netty要自己搞一套NIO呢? 这篇文章带你从jdk的源码和Netty的源码角度来分析为什么Netty要这么做。 JDK源码:openjdk-8u40 Netty源码:netty-4.1 1.先看J…

【数据结构】单链表的实现(C语言)

单链表是线性表链式储存的一种形式&#xff0c;其中的结点一般含有两个域&#xff0c;一个是存放数据信息的info域&#xff0c;另一个是指向该结点后继结点存放地址的指针next域。一个单链表必须要有一个首指针指向链表中的第一个结点。 单链表要掌握以下几种操作&#xff1a;…

《理解 OpenStack + Ceph》---来自-[爱.知识]-推荐

企业IT技术分享&#xff08;2016-06-29&#xff09;来自&#xff08;QQ群&#xff1a;企业私有云平台实战 454544014-推荐&#xff09;&#xff01;理解 OpenStack Ceph &#xff08;1&#xff09;&#xff1a;Ceph OpenStack 集群部署和配置http://www.cnblogs.com/sammyliu…

windows10 安装 mysql8.0.12 详解

【1】下载安装包 官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 如下图所示&#xff1a; 下载完成&#xff0c;安装包为mysql-8.0.12-winx64.zip 【2】安装准备 &#xff08;1&#xff09;安装路径。拷贝安装包到任意路径&#xff0c;然后解压缩。…

IDEA常用和实用配置以及各种必要插件

主要是收集IDEA常用和不常用配置陆续更新 ------------------------ 启动项目配置 建议使用idea2021.1.3以上版本&#xff1a; ------------------------ maven没有设置自动导包&#xff0c;导致引用不到第三方依赖。 可以点maven的刷新按钮即可。 idea 设置gradle自动更…

linux 调试利器gdb, strace, pstack, pstree, lsof

1)如何使用stracepstack利器分析程序性能?http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html此文有详细介绍怎么用strace和pstack2)Linux下多线程查看工具(pstree、ps、pstack)?http://blog.csdn.net/yfkiss/article/details/67293643)使用strace,lstrace,t…

【数据结构】单链表的应用(C语言)

1、设计一个算法&#xff0c;求一个单链表中的节点数 2、设计一个算法&#xff0c;在一个单链表中值为y的结点前插入一个值为x的结点&#xff08;值为x的新结点为成为值为y的结点前驱结点&#xff09; 3、设计一个算法&#xff0c;判断单链表中各结点是否有序 4、设计一个算…

物联网设备僵尸网络趋势分析

物联网&#xff08;IoT&#xff09;僵尸网络作者正在适应更安全的物联网设备的转变&#xff0c;这已经将***者的注意力转移到利用物联网设备的漏洞上。由于物联网设备安全性仍处于起步阶段&#xff0c;因此发现命令注入等基本漏洞并不少见。2018年11月&#xff0c;NetScout的As…

Redis6安装配置集群cluster以及集群宕机注意事项

Redis6的cluster模型推荐3主3从 先准备3台服务器&#xff0c;每个上面部署2个redis&#xff0c;服务器配置2核2G&#xff1a; 下面在每台服务器安装redis6&#xff0c;每台机器只要安装一次即可&#xff0c;然后分别配置2个端口的conf文件&#xff0c;分别起来即可&#xff1a…

【数据结构】循环单链表的实现(C语言)

循环单链表应掌握以下基本操作&#xff1a; 1、建立一个空的循环单链表。 2、获得循环单链表的最后一个结点的位置。 3、输出循环单链表中各结点的值。 4、在循环单链表中查找值为x的结点。 5、在循环单链表中第i个结点后插入值为x的新结点。 6、在循环单链表中删除值为x…