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

P1890 gcd区间

题目传送门

前言:依旧是一道水题,看着那么多人再用线段树,我都懵了(因为我不会),本以为这道题只能用线段树,但是再仔细一看,好像可以用DP来做,所以就有了这篇题解(没错就是这么来的)。

题解:

DP的维度分析,以及DP意义:

首先这道题在询问的时候有两个参数,一个是l,另一个是r,询问得出的结果是区间 [l,r] ,所有数的最大公因数,所以我们可以这样,定义一个二维DP数组,横纵两个坐标表(i,j)表示从l到r这个区间内的最大公因数,这个做法有点类似于区间DP,但是要比区间简单

DP的状态转移方程:

我们先来看一个表格:

我们来看一下dp[i][j]是怎么得出来的,首先我们知道dp[i][j]是从第i个数到第j个数的最大公因数,所以我们应当找到dp[i][j]与前面dp数组的关系,我们知道有一个公式:

gcd(a,b,c)=gcd(gcd(a,b),c)

这个公式的意思就是三个数的最大公因数是其中两个数的最大公因数与第三个数的最大公因数,因为有了这个公式,我们就可以把gcd以及括号内的数替换成dp数组中的元素,以此来求出状态转移方程,我们可以假设gcd(a,b,c)为dp[i][j],那么gcd(a,b)就是dp[i[[j-1],则c就是a[j],把他带进去就可以得出状态转移方程(如下):

gcd(a,b,c)=gcd(gcd(a,b),c)

dp[i][j]=gcd(dp[i][j-1],c)

dp[i][j]=gcd(dp[i][j-1],a[j])

最后就知道了dp[i][j]=gcd(dp[i][j-1],a[j])就是我们最终的状态转移方程了,然后对着状态转移方程敲代码这道题就能轻松AC了。

gcd函数:

这个函数我们可以使用辗转相除法来求(也称欧几里得算法),利用被除数和除数的gcd为除数和余数的gcd是一样的结论,转而可以求解(这里有问题:NOIP是不允许用带下划线的gcd函数),所以咱们就乖乖手敲把(qwq):

int gcd(int a,int b){if(a%b==0){return b;}else{return gcd(b,a%b);}
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){if(a%b==0) return b;else return gcd(b,a%b);
}
int main(){int n,m;scanf("%d%d",&n,&m);int a[1005];int dp[1005][1005];for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){dp[i][j]=a[j];}else{dp[i][j]=gcd(dp[i][j-1],a[j]);}}}while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d",dp[l][r]);printf("\n");}return 0;
}

http://www.dtcms.com/a/323193.html

相关文章:

  • 在 VS Code 或 Visual Studio 2022 上搭建 ESP32-CAM 开发环境
  • 微软将于 10 月停止混合 Exchange 中的共享 EWS 访问
  • 论文复现内容关于一种新的线性电机系统齿槽力模型
  • 关于TensorRT的若干报错问题
  • [Oracle] TRUNC()函数
  • W25Q64中跨页写入数据
  • 总结-ArrayList的扩容机制和BigDecimal大数的底层
  • 机器学习DBSCAN密度聚类
  • 如何更改win11自带录音机所录制文件的存储路径
  • 禁用 WordPress 更新提示(核心、插件、主题)
  • 【重建技巧】Urban Scene Reconstruction-LoD细节提升
  • springBoot集成easyExcel 实现文件上传
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • 集成电路学习:什么是RViz机器人可视化工具
  • Java 时间和空间复杂度
  • 徘徊识别场景误报率↓77%:陌讯动态时序建模方案实战解析
  • 二叉搜索树的C语言实现
  • 《软件测试与质量控制》实验报告五 功能自动化测试
  • 掌握数据可视化:全局配置项详解
  • Java进阶之单列集合List接口下的通用方法
  • Ubuntu22.04 安装vitis2023.2 卡在“Generating installed device list“.
  • 【Datawhale AI夏令营】让AI读懂财报PDF(多模态RAG)(Task 2)
  • 用 C 语言深入理解 Linux 软链接:原理、API 与编程实践
  • 【CTF】PHP反序列化基础知识与解题步骤
  • Claude Code 的核心能力与架构解析
  • Alibaba Cloud Linux 3 生成 github 公钥
  • 【Word】行中包含英文字符致使下划线加粗的解决方法
  • 3款强力的Windows系统软件卸载工具
  • 理解协议最大传输单元(MTU)和TCP 最大报文段长度(MSS)
  • 力扣热题100------70.爬楼梯