Acwing--3494. 国际象棋(状态压缩dp)

这是一个关于解决棋盘问题的算法实现,具体是计算在N×M的棋盘上放置K个马,使得它们互不攻击的方案数量。通过动态规划和位运算来剪枝,减少了计算复杂性。程序给出了输入输出示例,并对关键函数lowbit进行了说明,该函数用于计算二进制中1的个数,对应马的增加数量。

众所周知,“八皇后” 问题是求解在国际象棋棋盘上摆放 88 个皇后,使得两两之间互不攻击的方案数。

已经学习了很多算法的小蓝觉得 “八皇后” 问题太简单了,意犹未尽。作为一个国际象棋迷,他想研究在 N×MN×M 的棋盘上,摆放 KK 个马,使得两两之间互不攻击有多少种摆放方案。

由于方案数可能很大,只需计算答案除以 10000000071000000007 (即 109+7109+7) 的余数。

如下图所示,国际象棋中的马摆放在棋盘的方格内,走 “日” 字,位于 (x,y)(x,y) 格的马(第 xx 行第 yy 列)可以攻击 (x+1,y+2)(x+1,y+2)、(x+1,y−2)(x+1,y−2)、(x−1,y+2)(x−1,y+2)、(x−1,y−2)(x−1,y−2)、(x+2,y+1)(x+2,y+1)、(x+2,y−1)(x+2,y−1)、(x−2,y+1)(x−2,y+1) 和 (x−2,y−1)(x−2,y−1) 共 88 个格子。

QQ截图20210512104039.png

输入格式

输入一行包含三个正整数 N,M,KN,M,K,分别表示棋盘的行数、列数和马的个数。

输出格式

输出一个整数,表示摆放的方案数除以 10000000071000000007 (即 109+7109+7) 的余数。

数据范围

对于 5%5% 的评测用例,K=1K=1;
对于另外 10%10% 的评测用例,K=2K=2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值