• 牛客 统计和生成所有不同的二叉树


    题目链接: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

    题目大意

      略。

    分析

      关于为什么是卡特兰数,可以这么想,对于经典问题“N个数入栈,有多少种出栈顺序?”,这个问题的答案是卡特兰数的第 N 项,那么本题就可以这么想,“N个数出栈,有多少种入栈顺序?”,这是因为中序遍历就是递归,就是要入栈出栈的。

    代码如下

      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] << " 
    "[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 << "]" << "
    ";
     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<class T>
     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 v;
     83     istringstream sin(s);
     84     sin >> v;
     85     return v;
     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 // 扩展欧几里德算法
    152 /**
    153  *    a*x + b*y = 1
    154  *    如果ab互质,有解
    155  *    x就是a关于b的逆元
    156  *    y就是b关于a的逆元
    157  *     
    158  *    证明: 
    159  *        a*x % b + b*y % b = 1 % b
    160  *        a*x % b = 1 % b
    161  *        a*x = 1 (mod b)
    162  */
    163 inline void ex_gcd(LL a, LL b, LL &x, LL &y, LL &d){
    164     if (!b) {d = a, x = 1, y = 0;}
    165     else{
    166         ex_gcd(b, a % b, y, x, d);
    167         y -= x * (a / b);
    168     }
    169 }
    170 
    171 // 求a关于p的逆元,如果不存在,返回-1 
    172 // a与p互质,逆元才存在 
    173 inline LL inv_mod(LL a, LL p = 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
    ", Catalan(N));
    205     return 0;
    206 }
    View Code
  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11368702.html
Copyright © 2020-2023  润新知