Cattle passenger statistics and generate all the different binary trees

Topic links: https://www.nowcoder.com/practice/4869f80e29e94d49a20f8d54d3bf2a65?tpId=101&tqId=33250&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question -ranking

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 }
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/11368702.html