当前位置: 首页 > 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.xdnf.cn/news/1271071.html

相关文章:

  • C++11中的移动语义
  • 【无标题】AI 赋能日常效率:实用案例与操作心得分享
  • B.10.01.6-DDD领域驱动设计:从理论到落地的完整指南
  • 数据挖掘2.6 Perceptron Modeling 感知器建模
  • Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)
  • 心灵笔记:正念冥想
  • 解决python错误:playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.
  • 3.5.2_1 随机访问介质访问控制
  • Python中的Lambda函数详解
  • 【排序算法】④堆排序
  • NTP /Chrony 网络时间协议
  • Leetcode-19. 删除链表的倒数第 N 个结点
  • 比较useCallback、useMemo 和 React.memo
  • 机器学习 K-Means聚类 无监督学习
  • 第4章 程序段的反复执行for语句P115练习题(题及答案)
  • 元宇宙技术如何改变社交方式?
  • 哈希与安全
  • pgAdmin 仪表盘的system部分不能显示,报SYSTEM_STATS扩展没有安装
  • C++ 中的智能指针
  • Qt 综述:从基础到一般应用
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)
  • 记一次奇异的bug
  • n8n 入门指南:更适合跨境出海搞钱的AI智能体
  • 基于 InfluxDB 的服务器性能监控系统实战(一)
  • vue3上传的文件在线查看
  • 【linux基础】Linux命令提示符解析与操作指南
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 Azure Data Studio
  • 编译技术的两条演化支线:从前端 UI 框架到底层编译器的智能测试
  • “自动报社保 + 查询导出 ” 的完整架构图和 Playwright C# 项目初始化模板
  • 基于IPD体系的研发项目范围管理