题目描述
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≤50),分别表示 A、B 的人数,保证人数合理性。
输出描述
要求输出一个整数,表示可以产生的花样种数。
输入输出样例
示例
输入
1 2
输出
3
思路:
确定最后一层,即可确定全部
参考代码:
from math import sqrt
N,M=map(int,input().split())
n = int(sqrt(2*M+2*N+0.25)-0.5) #高斯求和公式:MxN=(n+1)n/2
def f(n,x,N,M):
if N <0 or M <0:
return False
if n == 0:
return N == M == 0
next = (x ^ (x >> 1)) & ((1 << n) - 1) #相当于异或
cnt = bin(next)[2:].count('1') #bin()转化为二进制,类型为字符串,从2开始是因为转化为二进制ob1111,前面有ob
N = N - n + cnt
M = M - cnt
return f(n - 1, next, N, M)
c=0
for m in range(1<<n): #1<<n,相当于2^n,1>>n,相当于//2(整除2)
result = f(n,m,N,M)
if result:
c+=1
print(c)