yLOI2019 青原樱

链接

看完题目,结论就是:一道五三的题(应该吧_(:з」∠)_

反正是一道数论题

Idea

首先,看到这种“一个空位”的问题,第一想法就是把一棵樱花和它后面的空位视为一组(或者一个数).

另外我们可以发现,如果最后一个元素在\(n\)位置上时,那么是不用考虑它后面的那个空位的.

所以思路就出来了:分类讨论.

  1. 如果最后一个元素不在\(n\)位置上,那么此时相当于有\(n-m\)个空位,要插入\(m\)个元素,再加上这\(m\)个元素自身的排列,总共有\(A_m^mC_{n-m}^m\) 种合法方案.
  2. 如果如果最后一个元素在\(n\)位置上,那么此时相当于有\((n-1)-(m-1)=n-m\)个空位,要插入\(m-1\) 个元素,同样加上他们自身的排列,总共有 \(A_m^m C_{n-m}^{m-1}\) 种方案.

又因

\[ A_m^mC_{n-m}^{m-1}=m\ast A_{n-m}^{m-1}, A_m^mC_{n-m}^m=A_{n-m}^m \]

我们直接处理排列数即可.

求和,而我们知道\(A_x^y+y\ast A_x^{y-1}=A_{x+1}^y\)
这样就可以一遍用\(O(n)\)求得最后的值.

Code

于是代码就有了

int main(){
    int type=read(),n=read(),m=read(),p=read();
    int ans=1;
    for(int i=n-m*2+2;i<=n-m+1;i++) ans=(ans*i)%p;
    printf("%lld",ans);
    return 0;
}

转载于:https://www.cnblogs.com/cbyyc/p/11446414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值