对弈(nim-k游戏博弈)

problem

AliceAliceAliceBobBobBob 又在玩游戏。

AliceAliceAliceBobBobBob 在一个 1×n1\times n1×n 的网格图上玩游戏,网格图的 nnn 个格子中,有 kkk 个格子内被各放了一个棋子,其中 kkk 是一个偶数。

从左到右,这 kkk 个棋子依次被染色为红色、蓝色、红色、……、蓝色、红色、蓝色。其中红棋子是 AliceAliceAlice 的,蓝棋子是 BobBobBob 的。

两人轮流操作,需要遵循以下规则:

  • 每一回合轮到某人操作时,这个人只能移动自己的棋子。

  • 每个棋子只能在网格图内的格子之间移动,并且在移动棋子的时候,每个棋子不能跨过和这个棋子相邻的其它棋子。

  • 每次最少需要移动 111 个棋子,最多可以移动 mmm 个棋子。

  • 若移动多个棋子,则必须选择多个不同的棋子分别移动,每一个被选择移动的棋子不能停留在原位。

例如下图,当 AliceAliceAlice 操作时,若她要移动从左到右的第三个红棋子,那么她可以移动到的范围有下面这三个空心棋子的位置。

在这里插入图片描述

若某一回合,轮到某人操作时,这个人无法操作,那么这个人就输了。

现在 先手,假设两人均采用最优策略。

给定 n,k,mn,k,mn,k,m,请你求出有多少符合题意的初始局面,使得 AliceAliceAlice 必胜。对 1e9+71e9+71e9+7 取模。

solution

observationBobBobBob 只会向左移动,AliceAliceAlice 只会向右移动。

证明:因为如果 BobBobBob 向右移动,那么其左边的 AliceAliceAlice 的格子就会跟着移动【一直挤 BobBobBob 】,相互挤对方,但左边第一个是属于 AliceAliceAlice 的格子,所以最后一定是 AliceAliceAlice 会挤着 BobBobBobAliceAliceAlice 向左移动也是同理。

所以把一个 AliceAliceAlice 和一个 BobBobBob 的格子绑成一对。

ai:a_i:ai:iii 个红棋的位置,bi:b_i:bi:iii 个蓝棋的位置,di=bi−ai−1d_i=b_i-a_i-1di=biai1

这相当于有 k2\frac{k}{2}2k 堆石子,每堆石子个数为 did_idi

这就转化成了经典的 nim-k 游戏【每次可以选择 1∼k1\sim k1k 堆石子,拿走任意的石子数量,最后不能操作者输。】

结论:当所有的 did_idi 转化成二进制后,每个二进制位上为 111 的个数 %(k+1)=0\%(k+1)=0%(k+1)=0 则是必败局面。

证明:

  • 000 的局面一定是 PPP 局面。

  • 任何一个 PPP 状态,经过一次操作以后必然会到达 NNN 状态。

    • 在某一次移动中,至少有一堆被改变,即至少有一个二进制位被改变。

      由于最多只能改变 kkk 堆石子,所以对于任何一个二进制位,111 的个数至多改变 kkk

      又有原先总数为 k+1k+1k+1 的整数倍,所以改变之后必然不可能仍是 k+1k+1k+1 的整数倍。

      故在 PPP 状态下一次操作的结果必然是 NNN 状态。

  • 任何 NNN 状态,总有一种操作使其变化成 PPP 状态。

    • 从高位到低位考虑所有的二进制位。

      假设用了某种方法,改变了 mmm 堆,使 iii 位之前的所有位都变为 k+1k+1k+1 的整数倍。

      现在要证明总有一种方法让第 iii 位也恢复到 k+1k+1k+1 的整数倍(包括 000)。

      显然,对于那些已经改变的 mmm 堆,当前的第 iii 位可以自由选择 111000【这只取决于操作时后拿走的石子个数】。

      不考虑已经操作的 mmm 堆,记剩下的堆的第 iii 位上 111 的总和为 sumsumsum

      • 分类讨论:

        • sum≤k−msum\le k-msumkm

          此时可以将这些堆上的 111 全部拿掉,然后让那 mmm 堆得 iii 位全部置成 000

        • sum>k−msum>k-msum>km

          此时我们在之前改变的 mmm 堆中选择 k+1−sumk+1-sumk+1sum 堆,将他们的第 iii 位设置成 111。剩下的设置成000

          由于 k+1−sum<k+1−(k−m)<m+1⇒k+1−sum≤mk+1-sum<k+1-(k-m)<m+1\Rightarrow k+1-sum\le mk+1sum<k+1(km)<m+1k+1summ,的确可以做到。

原博客证明

这样就可以 dpdpdp 了,用所有方案减去必败方案。

dpi,j:dp_{i,j}:dpi,j: 考虑到二进制位的 iii 位,一共用了 jjj 个石子的不合法方案数。

枚举下一个二进制有多少堆石子为 111,石子堆数必须是 m+1m+1m+1 的倍数。

dpi,j→dpi+1,j+2i+1⋅tdp_{i,j}\rightarrow dp_{i+1,j+2^{i+1}·t}dpi,jdpi+1,j+2i+1t

当然需要考虑是哪几堆,所以需要组合数。

最后要考虑将所有格子分成 kkk 堆,用隔板法计算。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 10005
#define int long long
#define mod 1000000007
int fac[maxn], inv[maxn], dp[maxn];
int n, k, m;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void init() {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod;
}int C( int n, int m ) { return fac[n] * inv[m] % mod * inv[n - m] % mod; }signed main() {freopen( "chess.in", "r", stdin );freopen( "chess.out", "w", stdout );scanf( "%lld %lld %lld", &n, &k, &m );init();int ans = C( n, k );n -= k, k >>= 1;dp[0] = 1;for( int w = 0;w < 15;w ++ )for( int i = n;i;i -- )for( int j = m + 1;( 1 << w ) * j <= i and j <= k;j += m + 1 )dp[i] = ( dp[i] + dp[i - ( 1 << w ) * j] * C( k, j ) ) % mod;for( int i = 0;i <= n;i ++ )ans = ( ans - dp[i] * C( n - i + k, k ) % mod + mod ) % mod;printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Netcore 2.0 Ocelot Api网关教程(6)- 配置管理

本文介绍Ocelot中的配置管理&#xff0c;配置管理允许在Api网关运行时动态通过Http Api查看/修改当前配置。由于该功能权限很高&#xff0c;所以需要授权才能进行相关操作。有两种方式来认证&#xff0c;外部Identity Server或内部Identity Server。1、外部Identity Server修改…

最短路径(虚树+期望)

problem 给定一棵 nnn 个结点的无根树&#xff0c;每条边的边权均为 111 。 树上标记有 mmm 个互不相同的关键点&#xff0c;小 A 会在这 mmm 个点中等概率随机地选择 kkk 个不同的点放上小饼干。 你想知道&#xff0c;经过有小饼干的 kkk 个点的最短路径长度的期望是多少。…

【学习笔记】最大权闭合子图和最大密度子图(最小割的模型应用)

最大权闭合子图和最大密度子图最大权闭合子图contentexercise最大密度子图contentexerciseUpd&#xff1a;最大权闭合子图易懂证明最大权闭合子图 content 先作出以下声明&#xff1a; c(u,v):c(u,v):c(u,v): 边 (u,v)(u,v)(u,v) 的容量。 f(u,v):f(u,v):f(u,v): 边 (u,v)(u,…

Docker最全教程之使用Docker搭建Java开发环境(十八)

前言Java是一门面向对象的优秀编程语言&#xff0c;市场占有率极高&#xff0c;但是在容器化实践过程中&#xff0c;发现官方支持并不友好&#xff0c;同时与其他编程语言的基础镜像相比&#xff08;具体见各语言镜像比较&#xff09;&#xff0c;确实是非常臃肿。本篇仅作探索…

AT2705 [AGC019F] Yes or No(组合数学)

解析 Atcoder的题超小的码量总让人做不出来的时候感到很不甘心… 但这题确实挺难的&#xff0c;主要还是魔术一样的奇淫技巧。 大力推式子那个阴间方法我直接选择弃疗。 一个很显然的结论是&#xff1a;肯定回答当前剩的比较多的选项。 pia一张洛谷的图&#xff1a; &#…

ASP.NET Core 项目简单实现身份验证及鉴权

环境VS 2017ASP.NET Core 2.2目标以相对简单优雅的方式实现用户身份验证和鉴权&#xff0c;解决以下两个问题&#xff1a;无状态的身份验证服务&#xff0c;使用请求头附加访问令牌&#xff0c;几乎适用于手机、网页、桌面应用等所有客户端基于功能点的权限访问控制&#xff0c…

ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

微软发布了其最新版本的机器学习框架&#xff1a;ML.NET 0.11带来了新功能和突破性变化。新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能&#xff0c;但也包括一些重大变化, 这也是发布RC版本之前的最后一个预览版&#xff0c;这个月底将发布0.12版本&#xff0c;也就…

如何使用AWS和Azure的配置存储服务保存读取配置

原文&#xff1a;Want to yank configuration values from your .NET Core apps? 作者&#xff1a;pauljwheeler译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10508748.html译者&#xff1a;Lamond Lu示例源代码&#xff1a;https://github.com/lamondlu/LoadConfigurat…

Meaningless Sequence Gym - 102832D

Meaningless Sequence Gym - 102832D 题意&#xff1a; 给你n和c&#xff0c;an的公式如下图 让你求a0…an的和&#xff0c;mod 1e97 题解&#xff1a; 训练时推了好一阵子才和队友推出 我看网上正解为&#xff1a; 一个数的大小与它的二进制表示中的1的个数有关 ac(二进制…

【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

一、什么是RPCRPC是“远程调用&#xff08;Remote Procedure Call&#xff09;”的一个名称的缩写&#xff0c;并不是任何规范化的协议&#xff0c;也不是大众都认知的协议标准&#xff0c;我们更多时候使用时都是创建的自定义化&#xff08;例如Socket&#xff0c;Netty&#…

.net Core2.2 WebApi通过OAuth2.0实现微信登录

前言微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。微信网页授权是通过OAuth2.0机制实现的&#xff0c;所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。开发流程1、新建一个…

Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链 Nginx优化(重点)与防盗链一、隐藏Nginx版本号1、修改配置文件2、修改源代码 二、修改Nginx用户与组1、编译安装时指定用户与组2、修改配置文件指定用户与组 三、配置Nginx网页的缓存时间四、实现Nginx的日志切割1、data的用法2、编写脚本进行日志切割的…

CodeForces730E Award Ceremony(拓扑排序+结论)

CF730E. Award Ceremonyproblemsolutioncodeproblem 题目链接 题目大意&#xff1a; 给出 nnn 个队封榜时的榜单 aia_iai​ 和揭榜时的变化情况 did_idi​。 揭榜时&#xff0c;这个队的名次会变化 tit_iti​。 注意在别的队揭榜时&#xff0c;自己队的排名也是动态变化的…

.Netcore 2.0 Ocelot Api网关教程(番外篇)- Ocelot v13.x升级

由于Ocelot系列博客好久没更新&#xff08;差不多有10个月的时间了&#xff09;&#xff0c;在此先说声抱歉&#xff0c;Ocelot系列会继续更新下去。在写上一篇配置管理的时候发现官方文档已经和以前的不一样&#xff0c;而Ocelot也从5.0版本更新到了13.x版本&#xff0c;进行了…

CF765F Souvenirs(暴力、线段树)

解析 比较神奇的一道题。 考虑一个常规套路&#xff1a;把询问离线&#xff0c;移动右端点&#xff0c;维护左端点答案。 考虑暴力维护&#xff0c;对于当前的 aixa_ixai​x&#xff0c;左侧如图所示的这两条线上的点都可以产生新的可能答案。 容易构造使得单次产生的新点是…

Hard Disk Drive HDU - 4788

Hard Disk Drive HDU - 4788 题意&#xff1a; 通常制造商认为1“kilo”等于1000&#xff0c;但操作系统会认为是1024。 因此&#xff0c;当你购买了一个100MB的硬盘&#xff0c;电脑却只显示大约有95MB&#xff0c;这缺失了大约5MB。 对于硬盘的大小&#xff0c;有多种单位描…

ASP.NET Core 沉思录 - 环境的思考

我的博客换新家啦&#xff0c;新的地址为&#xff1a;https://clrdaily.com :-D今天我们来一起思考一下如何在不同的环境应用不同的配置。这里的配置不仅仅指 IConfiguration 还包含 IWebHostBuilder 的创建过程和 Startup 的初始化过程。0 太长不读环境造成的差异在架构中基本…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖&#xff0c;但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开&#xff0c;可读性会好一些。本文将编写一个类型&#xff0c;可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…