Subject to the effect
slightly.
analysis
Why is the number on Cartland, you can think, for the classic question "N number stack, the stack order of how many?", The answer to this question is item number N of Cattleya, then this question can think, "N number of the stack, the stack order of how many?" this is because in order traversal is recursive, is to push the stack.
code show as below
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i) 6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i) 7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i) 9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i) 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) 12 13 #define pr(x) cout << #x << " = " << x << " " 14 #define prln(x) cout << #x << " = " << x << endl 15 16 #define LOWBIT(x) ((x)&(-x)) 17 18 #define ALL(x) x.begin(),x.end() 19 #define INS(x) inserter(x,x.begin()) 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end()) 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower); 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper); 24 25 #define ms0(a) memset(a,0,sizeof(a)) 26 #define msI(a) memset(a,0x3f,sizeof(a)) 27 #define msM(a) memset(a,-1,sizeof(a)) 28 29 #define MP make_pair 30 #define PB push_back 31 #define ft first 32 #define sd second 33 34 template<typename T1, typename T2> 35 istream &operator>>(istream &in, pair<T1, T2> &p) { 36 in >> p.first >> p.second; 37 return in; 38 } 39 40 template<typename T> 41 istream &operator>>(istream &in, vector<T> &v) { 42 for (auto &x: v) 43 in >> x; 44 return in; 45 } 46 47 template<typename T> 48 ostream &operator<<(ostream &out, vector<T> &v) { 49 Rep(i, v.size()) out << v[i] << " \n"[i == v.size() - 1]; 50 return out; 51 } 52 53 template<typename T1, typename T2> 54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) { 55 out << "[" << p.first << ", " << p.second << "]" << "\n"; 56 return out; 57 } 58 59 inline int gc(){ 60 static const int BUF = 1e7; 61 static char buf[BUF], *bg = buf + BUF, *ed = bg; 62 63 if(bg == ed) fread(bg = buf, 1, BUF, stdin); 64 return *bg++; 65 } 66 67 inline int ri(){ 68 int x = 0, f = 1, c = gc(); 69 for(; c<48||c>57; f = c=='-'?-1:f, c=gc()); 70 for(; c>47&&c<58; x = x*10 + c - 48, c=gc()); 71 return x*f; 72 } 73 74 template<classT> 75 inline String toString (T x) { 76 ostringstream Sout; 77 Sout << x; 78 return sout.str (); 79 } 80 81 inline int toInt ( string s) { 82 int in; 83 istringstream son (s); 84 son >> in; 85 return to; 86 } 87 88 // min <= AIM <= max 89 template <typename T> 90 inline bool BETWEEN(const T aim, const T min, const T max) { 91 return min <= aim && aim <= max; 92 } 93 94 typedef unsigned int uI; 95 typedef long long LL; 96 typedef unsigned long long uLL; 97 typedef vector< int > VI; 98 typedef vector< bool > VB; 99 typedef vector< char > VC; 100 typedef vector< double > VD; 101 typedef vector< string > VS; 102 typedef vector< LL > VL; 103 typedef vector< VI > VVI; 104 typedef vector< VB > VVB; 105 typedef vector< VS > VVS; 106 typedef vector< VL > VVL; 107 typedef vector< VVI > VVVI; 108 typedef vector< VVL > VVVL; 109 typedef pair< int, int > PII; 110 typedef pair< LL, LL > PLL; 111 typedef pair< int, string > PIS; 112 typedef pair< string, int > PSI; 113 typedef pair< string, string > PSS; 114 typedef pair< double, double > PDD; 115 typedef vector< PII > VPII; 116 typedef vector< PLL > VPLL; 117 typedef vector< VPII > VVPII; 118 typedef vector< VPLL > VVPLL; 119 typedef vector< VS > VVS; 120 typedef map< int, int > MII; 121 typedef unordered_map< int, int > uMII; 122 typedef map< LL, LL > MLL; 123 typedef map< string, int > MSI; 124 typedef map< int, string > MIS; 125 typedef set< int > SI; 126 typedef stack< int > SKI; 127 typedef deque< int > DQI; 128 typedef queue< int > QI; 129 typedef priority_queue< int > PQIMax; 130 typedef priority_queue< int, VI, greater< int > > PQIMin; 131 const double EPS = 1e-8; 132 const LL inf = 0x7fffffff; 133 const LL infLL = 0x7fffffffffffffffLL; 134 const LL mod = 1e9 + 7; 135 const int maxN = 1e6 + 7; 136 const LL ONE = 1; 137 const LL evenBits = 0xaaaaaaaaaaaaaaaa; 138 const LL oddBits = 0x5555555555555555; 139 140 LL N; 141 142 LL fac[maxN << 1]; 143 void init_fact() { 144 fac[0] = 1; 145 For(i, 1, (N << 1)) { 146 FAC [I] = (I * FAC [I - . 1 ])% MOD; 147 } 148 } 149 150 // AX + by = GCD (A, B) D = 151 // extended Euclidean algorithm 152 / * * 153 * a * b * Y = X +. 1 154 * ab If prime, solvability 155 * X is the inverse of a b, about 156 * Y b is the inverse element on a 157 * 158 * proof: 159 * a % B + B X * Y *% B. 1% B = 160. * X * A% B = B. 1% 161 * A = X *. 1 (B MOD) 162 * / 163 inlinevoid ex_gcd (LL A, LL B, LL & X, LL & Y, LL & D) { 164 is IF (! B) {D = A, X = . 1 , Y = 0 ;} 165 the else { 166 ex_gcd (B, A% B, Y, X, D); 167 is Y - X * = (a / B); 168 } 169 } 170. 171 is // find the inverse element on a p, and if there is, return -1 172 // a and p coprime, it exists an inverse element 173 inline inv_mod LL (LL A, P LL = MOD) { 174 LL D, X, Y; 175 ex_gcd (A, P, X, Y, D); 176 return D == . 1 ? (x % p + p) % p : -1; 177 } 178 179 inline LL comb_mod(LL m, LL n) { 180 LL ret; 181 182 if(m > n) swap(m, n); 183 184 ret = (fac[n] * inv_mod(fac[m], mod)) % mod; 185 ret = (ret * inv_mod(fac[n - m], mod)) % mod; 186 187 return ret; 188 } 189 190 // 求卡特兰数 191 inline LL Catalan(LL x) { 192 if(x == 0) return 1; 193 LL ret = inv_mod(x + 1, mod) * comb_mod(x, 2 * x); 194 return ret % mod; 195 } 196 197 int main(){ 198 //freopen("MyOutput.txt","w",stdout); 199 //freopen("input.txt","r",stdin); 200 //INIT(); 201 scanf("%lld", &N); 202 init_fact(); 203 if(N < 1) N = 0; 204 printf("%lld\n", Catalan(N)); 205 return 0; 206 }