
2019牛客暑期多校训练营(第七场)I——Chessboard(思维+组合数)
问题理解:我们需要在棋盘上放置玻璃球,使得每个k×k正方形区域的玻璃球总数相同。每个方格至少放置m个球,总和不超过n。 约束条件:无论选择哪个k×k的区域,总和都必须相同。这意味着棋盘上的每个方格可能必须具有相同的值,或者存在某种周期性排列,使得每个k×k区域的总和相同。 组合数学:根据官方题解,答案涉及组合数和阶乘的应用。我们需要计算每个可能的k值,满足条件的排列方式的数量,并将它们相加。 预计算阶乘和逆阶乘:为了高效计算组合数,我们需要预先计算阶乘和逆阶乘,并使用模运算来避免数值溢出。 动态规划:对于每个k值,计算满足条件的排列方式的数量。使用组合数来计算可能的排列方式,并对结果取模。 组合数计算:使用预计算的阶乘和逆阶乘来快速计算组合数,确保计算的高效性和准确性。 输入处理:读取输入数据,解析测试用例的数量和每个测试用例的参数。 预计算阶乘和逆阶乘:使用预计算的方法计算阶乘和逆阶乘,以便快速计算组合数。 组合数函数:定义组合数函数 动态规划计算:对于每个k值,计算满足条件的排列方式的数量。使用组合数累加和减去重叠部分,确保正确计数。 输出结果:对每个测试用例的结果进行模运算后输出。
发布日期:2021-05-10 16:10:14
浏览次数:23
分类:精选文章
本文共 1859 字,大约阅读时间需要 6 分钟。
要解决这个问题,我们需要计算满足特定条件的排列方式的数量。具体来说,我们需要确保在任意选择的k×k正方形区域内的玻璃球总数相同,并且总和不超过给定的上限。以下是详细的解决思路和代码实现:
问题分析
解决思路
代码实现
MOD = 998244353def main(): import sys input = sys.stdin.read data = input().split() T = int(data[0]) idx = 1 max_n = 2000 * 2 # 根据题目约束,n和m不超过2000 f = [1] * (max_n + 1) finv = [1] * (max_n + 1) for i in range(2, max_n + 1): f[i] = f[i-1] * i % MOD finv[i] = finv[i-1] * pow(i, MOD-2, MOD) % MOD def comb(n, k): if k < 0 or k > n: return 0 return f[n] * finv[k] % MOD * finv[n - k] % MOD results = [] for _ in range(T): n = int(data[idx]) m = int(data[idx+1]) idx +=2 ans = 0 for k in range(1, n+1): max_t = n - k * m if max_t < 0: continue current = 0 for t in range(0, max_t +1): c = comb(t + 2*k -1, 2*k -1) current = (current + c) % MOD if t >= k: c_sub = comb(t + k -1, 2*k -1) current = (current - c_sub) % MOD ans = (ans + current) % MOD results.append(ans % MOD) for res in results: print(res)if __name__ == "__main__": main()
代码解释
comb(n, k)
,使用预计算的阶乘和逆阶乘来高效计算。通过上述方法,我们能够高效地解决问题并计算满足条件的排列方式的数量。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月28日 20时05分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
iOS_Runtime3_动态添加方法
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
【SQLI-Lab】靶场搭建
2019-03-08
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09