Python:每日一题之机器人塔

题目描述

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值