发现单调不降序列反过来就是单调不增序列,只需考虑单调不降序列即可。
假如将问题转化为:初始为 \(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;
}
标签:int,题解,ll,re,答案,Array,CF57C,2n,单调
From: https://www.cnblogs.com/chang-an-22-lyh/p/18076691/cf57c-array-tj