"""
https://www.lanqiao.cn/problems/3075/learning/?page=1&first_category_id=1&problem_id=3075
"""
import os
import sys
def dfs(depth, last_val, tot, mul):
"""
:param depth: 第几条边
:param last_val: 上一条边的边长
:param tot: 当前所有边长的之和
:param mul: 当前所有边长之积
:return:
"""
if depth == n:
# N边形的条件: 前N - 1条边长度和大于第N边
if tot - path[-1] > path[-1]:
# 此时是一个合法的N边形
ans[mul] += 1
return
# 枚举第depth条边的边长为i
for i in range(last_val + 1, 100001):
# 可行性剪枝: n条边数字的的乘积不超过10 ** 5
# 已知已选择的depth个数字, 它们的乘积为mul
# 后续还有n - depth个数字,而且每个数字都大于i,
# 那么mul * (i ** (n - depth)) <= 100000条件一定成立
if mul * (i ** (n - depth)) <= 100000:
path.append(i)
dfs(depth + 1, i, tot + i, mul * i)
# 回溯删除边
path.pop()
else:
break
t, n = map(int, input().split())
# 记录N条边的边长
path = []
# ans[i]记录乘积为i的N边形数目
ans = [0] * 100001
dfs(0, 0, 0, 1)
# 预处理出前缀和
for i in range(1, 100001):
ans[i] += ans[i - 1]
for _ in range(t):
l, r = map(int, input().split())
print(ans[r] - ans[l - 1])
蓝桥杯-特殊的多边形
最新推荐文章于 2024-08-15 11:54:48 发布