【组合数学】CF1312D Count the Arrays

Educational Codeforces Round 83 (Rated for Div. 2) D.Count the Arrays
题目链接

题目描述

有一个长 n 的数组,数字范围在 1~m,这个数组中存在一对相同的数字,同时对于这个数组存在一个最大值使得这个数组严格递增并递减(呈现一个山峰形状),求有几个数组,答案对998244353取模

思路

取 n-1个数,做单调递增放左边,则有C[n-1][m] 种取法,然后再从左边的 n -2 个数中找一个数使得相等,最后枚举这个最大值的位置,也就是选择左边的几个数移到右边去,有 n - 3 个数,那么有
C[0][n-3] + C[1][n-3] + C[2][n-3] + … + C[n-4][n-3] + C[n-3][n-3] = 2^(n-3)
所有答案就是 C[n-1][m] * (n-2)*2^(n-3)

补一个组合数的知识点

乘法逆元+快速幂+阶乘的方法来给出取模组合数的模板
(a / b) mod m = ( a * k ) mod m; (k为b的逆元,m为模数)
因为将除法的模运算转化成乘法的模运算需要逆元,所以给出用费马小定理求逆元的原理
根据费马小定理:ap−1 ≡ 1 ( mod p)
两边同除a可推出:ap-2 ≡ 1/a ( mod p)
所以可得出 1/a 就是 a 的逆元
这个逆元 inv(a) 可用快速幂ap-2获得

模板

求C[n][m]

const ll p=100000007;		//模数,瞎写一个
ll kpow(ll a, ll n, ll p) {
   
	ll tmp=a;
	ll res=1;
	while(n) {
   
		if (n&1) res=res*tmp%p;
		n>>=1;
		tmp=tmp*tmp%p;
	}
	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值