当前位置: 首页 > news >正文

蓝桥杯-特殊的多边形(dfs/前缀和)

假设一个 n边形 n 条边为 a1,a2,a3,⋯,an定义该 nn 边形的值 v=a1×a2×a3×⋯×an

定义两个 n边形不同是指至少有一条边的长度在一个 nn 边形中有使用而另一个 nn 边形没有用到,如 n 边形 (3,4,5,6) 和 (3,5,4,6) 是两个相同的 n 边形,(3,4,5,6) 和 (4,5,6,7) 是两个不相同的 n 边形。

现在有t 和 n,表示 t 个询问并且询问的是 n 边形,每个询问给定一个区间 [l,r],问有多少个 n 边形(要求该 n 边形自己的 n 条边的长度互不相同)的值在该区间范围内。

输入格式

第一行包含两个正整数 t、n,表示有 t 个询问,询问的是 n 边形。

接下来 t 行,每行有两个空格隔开的正整数 l、r,表示询问区间 [l,r]。

输出格式

输出共 t 行,第 i 行对应第 i 个查询的 n 边形个数。

样例输入

4 3
1 10
30 50
60 200
200 400

样例输出

0
1
18
32

整体思路

整体思路是先通过深度优先搜索(DFS)生成所有可能的 n 边形,统计每个边值出现的次数,再使用前缀和来快速计算每个询问区间内的 n 边形数量。

详细步骤

1. 深度优先搜索(DFS)生成所有可能的 n 边形

在代码中,dfs 函数用于生成所有可能的 n 边形。

  • 参数说明
    • last:表示上一条边的长度,用于确保新边的长度大于上一条边,保证边的长度互不相同。
    • sum:表示当前已经选择的边的长度之和。
    • cnt:表示当前已经选择的边的数量。
    • mul:表示当前已经选择的边的长度的乘积。
  • 终止条件
    • 当 cnt 等于 (n + 1) 时,说明已经选择了 n 条边,此时将该 n 边形的边值 mul 对应的计数器 pre[mul] 加 1。
  • 递归过程
    • 从 last + 1 开始枚举新的边的长度 i。
    • 如果 i *mul 大于 100000,则停止搜索,因为后续的乘积会更大,不会满足要求。
    • 如果 cnt 等于 n 且 sum 小于等于 i,则停止搜索,因为此时不满足多边形的条件(任意一条边的长度小于其余边的长度之和)。
    • 递归调用 dfs 函数,更新 last 为 i,sum 为 sum + icnt 为 cnt + 1mul 为 i *mul。
2. 前缀和处理

在 DFS 完成后,使用前缀和数组 pre 来快速计算区间内的 n 边形数量。

  • 对于前缀和数组 prepre[i] 表示边值小于等于 i 的 n 边形的数量。
  • 通过遍历 1 到 100000,将 pre[i] 更新为 pre[i] + pre[i - 1]
3. 处理询问

对于每个询问的区间[l, r],通过前缀和数组计算边值在该区间内的 n 边形的数量。

  • 边值在区间 [l, r] 内的 n 边形的数量为 pre[r] - pre[l - 1]

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long

int t,n,l,r,pre[100005];
void dfs(int last,int sum,int cnt,int mul){
    if(cnt==n+1){
        pre[mul]++;
        return ;
    }
    for(int i=last+1;i<=100000;++i){
        if(i*mul>100000)return;
        if(cnt==n&&sum<=i)return;
        dfs(i,sum+i,cnt+1,i*mul);   

    }
}

signed main()
{
    cin>>t>>n;
    dfs(0,0,1,1);
    for(int i=1;i<=1e5;i++){
        pre[i]+=pre[i-1];
    }
    for(int i=0;i<t;++i){
        cin>>l>>r;
        cout<<pre[r]-pre[l-1]<<'\n';
    }
    return 0;
}

相关文章:

  • 指针和引用
  • 业务流程先导及流程图回顾
  • YOLO基础知识
  • 【C语言文件精选题】
  • 《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2
  • 验证Linux多进程时间片切换的程序
  • PyTorch 张量的new_tensor方法介绍
  • 算法基础——树
  • RAG基建之PDF解析的“流水线”魔法之旅
  • 网络安全-网络安全基础
  • freecad gear模块 生成齿轮导出fcstd step
  • 20组电影美学RED摄像摄影机视频胶片模拟色彩分级调色LUT预设包 Pixflow – CL – RED Camera LUTs
  • 项目实战--权限列表
  • Mybatis日志模块分析--适配器模式+代理模式
  • 身份验证:区块链如何让用户掌控一切
  • Scrapy对比Selenium:哪个最适合您的网络爬虫项目
  • 深度学习Note.5(机器学习2)
  • Unity中UDP异步通信常用API使用
  • Python小练习系列 Vol.7:全排列生成(回溯算法模板题)
  • Spring笔记03-依赖注入
  • 陕西省通报6起违反八项规定典型问题,省卫健委原主任刘宝琴违规收受礼品礼金
  • 解放日报:上海深化改革开放,系统集成创新局
  • 民生银行一季度净利127.42亿降逾5%,营收增7.41%
  • 解读|特朗普“助攻”下加拿大自由党“惨胜”,卡尼仍需克服“特鲁多阴影”
  • 金科股份:去年营收约275亿元,今年确保所有项目“零烂尾”
  • 吕国范任河南省人民政府副省长