牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp
2024-09-04 02:17:35
LINK:牛牛与序列
(牛客div1的E题怎么这么水... 还没D难.
定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_i\leq k$
人话解释:一个合法序列 每个数字都在1~k之间 且有两个相邻数字是递增关系两个相邻数字是递减关系。
发现我们枚举某两个位置递增递减再进行计数会重复 而且很难减掉重复方案。这个不能代表元容斥。
考虑总方案-不合法方案。发现不合法方案就两种不增,不降.
显然不增翻转一下就是不降 考虑求出不增的方案数 考虑从前往后放数字且数字大小递减 每个数字都可以分到一些位置。
容易发现是一个隔板法 所以总方案数为C(n+k-1,k-1).
值得注意的是 最后要加上k 因为所有数字都相同时 同时为不增和不降。
这个组合数可以O(k)计算。可以通过此题。
而题解上给了一个dp 这个dp也很显然f[i][j]表示前i个数字使用的最小数字为j的方案数。
最后答案为$\sum_^f[n][i]$ 更扯得是 需要打标发现是上述的组合数 再接一个数学归纳法证明。
我觉得很麻烦 可能正因为如此 出题人才把这道题放到E吧.
const ll MAXN=100010;
ll n,k,T;
ll ans;
inline ll ksm(ll b,ll p)
{
ll cnt=1;
while(p)
{
if(p&1)cnt=cnt*b%mod;
b=b*b%mod;p=p>>1;
}
return cnt;
}
signed main()
{
freopen("1.in","r",stdin);
get(T);
while(T--)
{
get(n);get(k);
ans=ksm(k,n%(mod-1))+k;
ll cnt=1,ww=1;
fep(n+k-1,n+1,i)cnt=cnt*i%mod,ww=ww*(i-n)%mod;
ww=ksm(ww,mod-2);
putl(((ans-cnt*ww%mod*2%mod)%mod+mod)%mod);
}
return 0;
}
最新文章
- [原创]mybatis详解说明
- Android学习---数据库的增删改查(sqlite CRUD)
- WCF初探-10:WCF客户端调用服务
- (转)Unity3d中的属性(Attributes)整理
- MVC项目中应用富文本编辑器UEditor中的几个坑
- C实现类封装、继承、多态
- python 传入参数返回的时候好像有些时候会出现莫名其妙的循环
- SQL Server 内存使用量下降问题
- winform使用xml作为数据源
- 一起C语言中程序时序问题的排查过程
- 采用objdump调试驱动程序
- 拿到月薪30K,必选一些Python好书!
- java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系
- puppet 横向扩展(一)
- 在windows下安装Redis
- 如何修改 FastAdmin 弹窗大小?
- dp练习(9)——最大乘积
- 如使用Typescript撸Vue(Vue2 + TS +TSX+CSS module)
- swift 分页视图
- 利用html5调用本地摄像头拍照上传图片[转]