UVA 10516 Another Counting Problem

来源:互联网 发布:淘宝贝幼儿园收费 编辑:程序博客网 时间:2024/04/28 08:17

大意略。

思路:组合数学神马的,最难思考了。

我想这道题的结论可以记下来,即:满K叉树的前i层的不同的树的数量为:f[i-1]^K + 1

参考了这篇博客:解法

#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <cstdio>#include <queue>#include <cmath>using namespace std;const int MAXN = 1010;int base, n;struct bign{int s[MAXN], len;bign () {memset(s, 0, sizeof(s)); len = 1;}bign (int num) { *this = num;}bign (const char *num) {*this = num;}bign operator = (int num){char s[MAXN];sprintf(s, "%d", num);*this = s;return *this;}bign operator = (const char *num){len = strlen(num);for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';return *this;}bign operator + (const bign &b){bign c;c.len = 0;for(int i = 0, g = 0; g || i < max(len, b.len); i++){int x = g;if(i < len) x += s[i];if(i < b.len) x += b.s[i];c.s[c.len++] = x % 10;g = x / 10;}return c;}void clean(){while(len > 1 && !s[len-1]) len--;}bign operator - (const bign &b){bign c;c.len = 0;for(int i = 0, g = 0; i < len; i++){int x = s[i] - g;if(i < b.len) x -= b.s[i];if(x >= 0) g = 0;else{g = 1;x += 10;}c.s[c.len++] = x;}c.clean();return c;}bign operator * (const bign &b){bign c;c.len = len + b.len;for(int i = 0; i < len; i++){for(int j = 0; j < b.len; j++){c.s[i+j] += s[i] * b.s[j];}}for(int i = 0; i < c.len; i++){c.s[i+1] += c.s[i] / 10;c.s[i] %= 10;}c.clean();return c;}bign operator *= (const bign &b){*this = *this * b;return *this;}string str() const{string res = "";for(int i = 0; i < len; i++) res = char(s[i]+'0') + res;if(res == "") res = "0";return res;}}f[2020];ostream& operator << (ostream &out, const bign &x){out << x.str();return out;}void cal(){f[0] = 1;for(int i = 1; i <= n; i++){bign temp = 1;for(int j = 1; j <= base; j++){temp *= f[i-1];}f[i] = temp+1;}}void solve(){printf("%d %d ", base, n);cout<<f[n]-f[n-1]<<endl;}int main(){while(~scanf("%d%d", &base, &n) && (base || n)){cal();solve();}return 0;}



原创粉丝点击