解题思路:

观察A和B的规律:A只能由两个相同字母得到,B只能由两个不同字母得到->等价于异或中的运算规则

1^0=1,0^1=1,0^0=1,1^1=0.即A=0,B=1

再看摆放条件,是下层决定上层,所以先摆放最底层的A和B,再决定上层如何摆放,重复这个过程直至所有的A和B被摆放完,最后看是否所有层都摆满,若摆满了说明最底层的摆放可行,计数+1

注意事项:

参考代码:

import itertools, collections

m, n = map(int, input().strip().split())
sum_up = m + n
level = 0
while sum_up: # 求出层数,构成三角形的总数刚好是等差数列的和
    level += 1
    sum_up -= level

count = 0
for i in itertools.product(range(2), repeat = level):#利用product生成最底层01(AB)的全排列
    temp_i = list(i)
    temp = collections.Counter(temp_i)#统计所需的0和1的个数
    temp_m = m - temp[0] # 剩余A的个数
    temp_n = n - temp[1] # 剩余B的个数
    temp_level = level - 1 # 从第二层开始(第一层摆好了)
    while (temp_m > 0 or temp_n > 0) and temp_level > 0:
        temp_j = []
        j = 0
        while j < temp_level:
            cur = temp_i[j] ^ temp_i[j + 1]
            temp_j.append(cur)
            if int(cur) == 0:
                temp_m -= 1
            else:
                temp_n -= 1
            j += 1
        temp_i = temp_j #更新底层的排列
        temp_level -= 1
    if temp_level == 0 and temp_m == 0 and temp_n == 0:
        count += 1

print(count)


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论