• 10247


    Problem B

    Complete Tree Labeling!

    Input: standard input

    Output: standard output

    Time Limit: 45 seconds

    Memory Limit: 32 MB

    A complete k-ary tree is a k-ary tree in which all leaves have same depth and all internal nodes have degree k. This k is also known as the branching factor of a tree. It is very easy to determine the number of nodes of such a tree. Given the depth and branching factor of such a tree, you will have to determine in how many different ways you can number the nodes of the tree so that the label of each node is less that that of its descendants. You should assume that for numbering a tree with N nodes you have the (1, 2, 3, N-1, N) labels available.

    Input

    The input file will contain several lines of input. Each line will contain two integers k and d. Here k is the branching factor of the complete k-arytree and d is the depth of the complete k-ary tree (k>0, d>0, k*d<=21).

    Output

    For each line of input, produce one line of output containing a round number, which is the number of ways the k-ary tree can be labeled, maintaining the constraints described above.

    Sample Input:

    2 2

    10 1

     

    Sample Output:

    80

    3628800

    题意:k叉d层树最多组成几种搜索树。

    思路:参考http://www.2cto.com/kf/201310/251470.html

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    
    #define max(a,b) (a)>(b)?(a):(b)
    #define min(a,b) (a)<(b)?(a):(b)
    
    const int MAXSIZE = 10000;
    
    struct bign {
    	int s[MAXSIZE];
    	bign ()	{memset(s, 0, sizeof(s));}
    	bign (int number) {*this = number;}
    	bign (const char* number) {*this = number;}
        
    	void put();
    	bign mul(int d);
    	void del();
    	void init() { memset(s, 0, sizeof(s)); }
        
    	bign operator =  (char *num);
    	bign operator =  (int num);
    	
    	bool operator <  (const bign& b) const;
    	bool operator >  (const bign& b) const { return b < *this; }
    	bool operator <= (const bign& b) const { return !(b < *this); }
    	bool operator >= (const bign& b) const { return !(*this < b); }
    	bool operator != (const bign& b) const { return b < *this || *this < b;}
    	bool operator == (const bign& b) const { return !(b != *this); }
        
    	bign operator + (const bign& c);
    	bign operator * (const bign& c);
    	bign operator - (const bign& c);
    	int  operator / (const bign& c);
    	bign operator / (int k);
    	bign operator % (const bign &c);
    	int  operator % (int k);
    	void operator ++ ();
    	bool operator -- ();
    };
    
    bign f[25][25];
    int node[25][25];
    int n, m;
    
    
    bign c(int n, int m) {
        bign ans = 1;
        m = min(m, n - m);
        for (int i = 0; i < m; i ++) {
    		bign save = (n - i);
    		ans = ans * save / (i + 1);
    	}
        return ans;
    }
    
    void init() {
    	int i, j, k;
    	for (i = 1; i <= 21; i ++) {
    		f[i][0] = 1; node[i][0] = 1;
    		for (j = 1; j <= 21 / i; j ++) {
    			f[i][j] = 1;
    			for (k = 0; k < i; k ++) {
    				node[i][j] = node[i][j - 1] * i + 1;
    				f[i][j] = f[i][j] * c(node[i][j] - 1 - k * node[i][j - 1], node[i][j - 1]) * f[i][j - 1];
    			}
    		}
    	}
    }
    
    
    int main() {
        init();
        while (~scanf("%d%d", &n, &m)) {
    		f[n][m].put();
    		printf("
    ");
        }
        return 0;
    }
    
    bign bign::operator = (char *num) {
    	init();
    	s[0] = strlen(num);
    	for (int i = 1; i <= s[0]; i++)
    		s[i] = num[s[0] - i] - '0';
    	return *this;
    }
    
    bign bign::operator = (int num) {
    	char str[MAXSIZE];
    	sprintf(str, "%d", num);
    	return *this = str;
    }
    
    bool bign::operator < (const bign& b) const {
    	if (s[0] != b.s[0])
    		return s[0] < b.s[0];
    	for (int i = s[0]; i; i--)
    		if (s[i] != b.s[i])
    			return s[i] < b.s[i];
    		return false;
    }
    
    bign bign::operator + (const bign& c) {
    	int sum = 0;
    	bign ans;
    	ans.s[0] = max(s[0], c.s[0]);
    	
    	for (int i = 1; i <= ans.s[0]; i++) {
    		if (i <= s[0]) sum += s[i];
    		if (i <= c.s[0]) sum += c.s[i];
    		ans.s[i] = sum % 10;
    		sum /= 10;
    	}
    	return ans;
    }
    
    bign bign::operator * (const bign& c) {
    	bign ans;
    	ans.s[0] = 0; 
    	
    	for (int i = 1; i <= c.s[0]; i++){  
    		int g = 0;  
    		
    		for (int j = 1; j <= s[0]; j++){  
    			int x = s[j] * c.s[i] + g + ans.s[i + j - 1];  
    			ans.s[i + j - 1] = x % 10;  
    			g = x / 10;  
    		}  
    		int t = i + s[0] - 1;
    		
    		while (g){  
    			++t;
    			g += ans.s[t];
    			ans.s[t] = g % 10;
    			g = g / 10;  
    		}  
    		
    		ans.s[0] = max(ans.s[0], t);
    	}  
    	ans.del();
    	return ans;
    }
    
    bign bign::operator - (const bign& c) {
    	bign ans = *this;
    	int i;
    	for (i = 1; i <= c.s[0]; i++) {
    		if (ans.s[i] < c.s[i]) {
    			ans.s[i] += 10;
    			ans.s[i + 1]--;;
    		}
    		ans.s[i] -= c.s[i];
    	}
    	
    	for (i = 1; i <= ans.s[0]; i++) {
    		if (ans.s[i] < 0) {
    			ans.s[i] += 10;
    			ans.s[i + 1]--;
    		}
    	}
    	
    	ans.del();
    	return ans;
    }
    
    int bign::operator / (const bign& c) {
    	int ans = 0;
    	bign d = *this;
    	while (d >= c) {
    		d = d - c;
    		ans++;
    	}
    	return ans;
    }
    
    bign bign::operator / (int k) {
    	bign ans; 
    	ans.s[0] = s[0];
    	int num = 0;  
    	for (int i = s[0]; i; i--) {  
    		num = num * 10 + s[i];  
    		ans.s[i] = num / k;  
    		num = num % k;  
    	}  
    	ans.del();
    	return ans;
    }
    
    int bign:: operator % (int k){  
    	int sum = 0;  
    	for (int i = s[0]; i; i--){  
    		sum = sum * 10 + s[i];  
    		sum = sum % k;  
    	}  
    	return sum;  
    } 
    
    bign bign::operator % (const bign &c) {
    	bign now = *this;
    	while (now >= c) {
    		now = now - c;
    		now.del();
    	}
    	return now;
    }
    
    void bign::operator ++ () {
    	s[1]++;
    	for (int i = 1; s[i] == 10; i++) {
    		s[i] = 0;
    		s[i + 1]++;
    		s[0] = max(s[0], i + 1);
    	}
    }
    
    bool bign::operator -- () {
    	del();
    	if (s[0] == 1 && s[1] == 0) return false;
    	
    	int i;
    	for (i = 1; s[i] == 0; i++)
    		s[i] = 9;
    	s[i]--;
    	del();
    	return true;
    }
    
    void bign::put() {
    	if (s[0] == 0)
    		printf("0");
    	else
    		for (int i = s[0]; i; i--)
    			printf("%d", s[i]);
    }
    
    bign bign::mul(int d) {
    	s[0] += d;
    	int i;
    	for (i = s[0]; i > d; i--)
    		s[i] = s[i - d];
    	for (i = d; i; i--)
    		s[i] = 0;
    	return *this;
    }
    
    void bign::del() {
    	while (s[s[0]] == 0) {
    		s[0]--;
    		if (s[0] == 0) break;
    	}
    }
    


  • 相关阅读:
    Mybatis 的 xml 文件语法错误,启动项目时控制台一直循环解析但是不打印错误
    在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
    【Important】数据库索引原理
    服务化的演变和负载均衡
    【问题集】redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range
    【Spring】Spring中用到的设计模式
    【设计模式】责任链模式
    【!Important】Zookeeper用来做什么的,有几种类型的节点
    【!Important】如何保证线程执行的先后顺序
    【!Important】Java线程死锁查看分析方法
  • 原文地址:https://www.cnblogs.com/riasky/p/3429084.html
Copyright © 2020-2023  润新知