CF57C Array 题解

发现单调不降序列反过来就是单调不增序列,只需考虑单调不降序列即可。

假如将问题转化为:初始为 \(1\),一共有 \(n+1\) 个位置,有 \(n-1\) 次增加答案的机会,每个位置可以拥有多次增加答案的机会,问一共有多少种可能性。

显然答案为 \(C_{2n-1}^{n-1}\)。所以总体答案为 \(2C_{2n-1}^{n-1}-n\),观察杨辉三角即可发现也可以表示为 \(C_{2n}^n-n\)
时间复杂度 \(O(n\log p)\),其中 \(p=10^9+7\)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=1e9+7;
ll n,ans=1;
ll qpow(ll x,int y){
    ll re=1;
    while(y){
        if(y&1) re=re*x%p;
        x=x*x%p;
        y>>=1;
    }return re;
}int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        ans=ans*qpow(i,p-2)%p;
        ans=ans*(i+n)%p;
    }cout<<((ans-n)%p+p)%p;
    return 0;
}
posted @ 2024-03-16 08:46  长安一片月_22  阅读(4)  评论(0编辑  收藏  举报