题目
给定n,m,求长为n(n<=1e7)且满足以下条件的序列a的个数,答案对998244353取模
①0<=a1<=a2<=...<=an<=m
②a_{i}%3与a_{i+1}%3不同,即相邻项模3的余数不同
思路来源
megurine烟花佬
第一层枚举的是 a1 % 3 的值,
第二层循环枚举的是一共 (a[i + 1] - a[i]) % 3 的值中2的个数,
一共 n - 1个差分数,然后再加上m的值可能不需要用完
也就是说余数,所以一共 n + 1个数,最后一个数是m - a[n]
题解
考虑构造差分序列b,b1=a1,b2=a2-a1,...
则最终b2到bn中不能有含0的项,只能为1或2,
枚举a1%3的值0,1,2,枚举后n-1项里有x项%3=2,则其他项%3=1
其余的相邻项之间的增量,只能用3的倍数来填,
相当于a0=0,a_{n+1}=m,中间n个数,共计n+2个数,
差分数组b共n+1项,每一项delta都是一个>=0的3的倍数
(b_{n+1}即最后一项可能不是,但只关心最后一项/3*3的值)
n+1个人平分总量(m-(n-1)-c2-a0)/3,每个人允许为0
插空法知x个人平分y每个人>=0的方案数为C(x+y-1,x-1),代入即可
心得
n+1个数,可能不需要用完,
这个trick,感觉是典中典,之前好像也是在abc遇到过
代码
#include <bits/stdc++.h

本文针对给定长度和范围条件下,解决寻找符合条件的序列数量问题。通过差分序列转换简化问题,并采用组合数学方法计算不同情况下序列的数量。
最低0.47元/天 解锁文章
924

被折叠的 条评论
为什么被折叠?



