CF57 C. Array
题意:
问有多少个长为n的序列满足以下要求:
1、每个数的范围为[1,n]
2、序列非增或者非降
对于任何一个值域为n、长度为n的序列,我们都可以通过排序的方式是他变成非增或者非降
所以要求2可以不管
问题就变成了设xi(>=0)表示数字i有多少个,求不定方程x1+x2+x3+……+xn=n 的解的个数
设yi=xi+1(>=1),y1+y2+y3+……+yn=2n
根据插板法有C(2n-1,n-1)组解
因为非增和非降都可以,所以除了n个数都是同一个数的解还要乘2
所以答案是C(2n-1,n-1)*2-n
#include<bits/stdc++.h> using namespace std; #define N 200002 const int mod=1000000007; long long fac[N],invf[N]; long long poww(long long a,long long b) { long long c=1; for(;b;a=a*a%mod,b>>=1) if(b&1) c=c*a%mod; return c; } int main() { int n; scanf("%d",&n); fac[0]=1; for(int i=1;i<=n+n;++i) fac[i]=fac[i-1]*i%mod; invf[n+n-1]=poww(fac[n+n-1],mod-2); for(int i=n+n-2;i>=0;--i) invf[i]=invf[i+1]*(i+1)%mod; long long ans=fac[n+n-1]*invf[n-1]%mod*invf[n]%mod*2%mod; ans=(ans-n+mod)%mod; printf("%lld",ans); }