题目描述
X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。
类似:
A
B B
A B A
A A B B
B B B A B
A B A B B A
队内的组塔规则是:
A 只能站在 AA 或 BB 的肩上。
B 只能站在 AB 或 BA 的肩上。
你的任务是帮助拉拉队计算一下,在给定A与B的人数时,可以组成多少种花样的塔。
输入一行两个整数 M 和 N,空格分开(0<M,N<500),分别表示A、B的人数,保证人数合理性。
要求输出一个整数,表示可以产生的花样种数。
输入
输入一行两个整数 M 和 N,空格分开(0<M,N<500),分别表示A、B的人数,保证人数合理性。
输出
要求输出一个整数,表示可以产生的花样种数。
样例输入
1 2
样例输出
3
代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 50;
int m, n, k(0);
char ct[N];
int main(void)
{
cin >> m >> n;
while (k * (k + 1) != (m + n) * 2) ++k;
int res = 0;
for (int i = 0; i < (1 << k); ++i) {
int t = i, ca(0), cb(0);
for (int j = 0; j < k; ++j) {
if (t & 1) ct[j] = 'A', ++ca;
else ct[j] = 'B', ++cb;
t >>= 1;
}
t = k;
while (t) {
for (int j = 0; j < t - 1; ++j) {
if (ct[j] == ct[j + 1]) ct[j] = 'A', ++ca;
else ct[j] = 'B', ++cb;
}
--t;
}
if (ca == m && cb == n) ++res;
}
cout << res << endl;
return 0;
}