思路一:
从1~n中选几个数但这几个数的顺序不变
我们把1和|的序列看作一个组合
如1||11表示一个1,零个2,两个3
共2n-1个位置放n个1,n-1个隔板|
所以就有情况,
然后对称性,加上不增序列共,其中有n个同一数序列重复计算,如 1 1 1 1 1 1 1...
所以减掉重复的一共
思路二:
f【1e5】【1e5】是肯定超时的
打表找下规律
杨辉三角
所以f【i】【j】=C(i+j-1,j)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10,mod=1e9+7; ll n; ll fact[N]; ll qmi(ll a,ll b,ll mod){ ll ans=1; while(b){ if(b&1){ ans=(ans*a)%mod; } a=a*a%mod; b>>=1; } return ans; } int main(){ cin>>n; fact[0]=1; for(int i=1;i<=n<<1;i++) fact[i]=fact[i-1]*i%mod; cout<<(fact[n<<1]*qmi(fact[n]*fact[n]%mod,mod-2,mod)-n)%mod;//错误:qmi(fact[n],(mod-2)<<1,mod) return 0; }