题目:hdu的5726

(我原博客的东西,正好整理过来,属于st表裸题)

(可以看出我当时有多么的菜……)

这道题写了一遍,然而蒟蒻的我的时间爆炸了……

于是看了一下学长的代码(顺便在此处%一下学长)。

不明觉厉了两个小时

终于看明白了

由于这道题是基于st表写的(这部分比较基础)

我就直接讲第二问(就是查相等GCD个数)

那么为了不用每一个区间挨个比较一遍的话,我们所能想到的速度较快的方法……

对!二分。

但是如果把二分的方法想象成类似于查询数的方法那是不可以的(因为数字是无序的,很容易造成GCD增长趋势无规律,所以这个方法行不通)

然后怎么办呢?

这时候,如果我们固定左端点,存下左端点的值,然后去移动右端点的话,我们会发现什么呢?

对,没错!我们发现了突破口!

以这种方式移动而形成的区间的GCD永远要小于等于咱们存的值(这个不用讲为什么也应该能明白吧(即GCD永远不会大于整个区间内最小的数))

也就是说GCD的值成单调不上升趋势。

好的,然后我们怎么办呢?固定左端点,慢慢移动右端点来算?

不用不用,我们用二分的思想,让它跳跃查询。

(以下话请对照程序看)

首先我们需要两个指针,取它们的mid,然后比较

如果从左端点(即i)到mid的区间恰好等于所存值(即g),那么就说明有这个区间的长度数个相同的GCD。

此时我们就可以将mid稍稍往右移一些,看看是否个数还能再增加(通过右移l实现)

如果增加不了的话,就说明mid太大了,往左移一些(通过左移r实现)

直到两个指针碰在一起了,算出个数(注意是将个数加上(+=)而不是赋值(=))

然后呢将我们所存值(g)缩小一些(即移动j,然后g=suan(i,j))(因为此时mid=l,将j放在l的外面的话g恰好不一样(而且肯定变小))

再重复上述步骤就可以了,我们此时就能得到所有GCD相同的个数了

注意:因为本体数据过大,所以用map,具体怎么实现……还是看代码吧,我也不太会(也就是说,其实就是将二分的方法和map复述一遍罢了……这方法不是我原创的但题解是我写的(来自强迫症的我))

附上代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
map<int,long long>mp;
int gcd(int a, int b){
if(!b)return a;
else return gcd(b,a%b);
}
int dp[100001][30];
int qpow(int a){
return (1<<a);
}
void st(int n){
for(int j=1;j<=int(log2(n));j++){
for(int i=1;i<=n;i++){
int p=i+qpow(j)-1;
if(p>n)continue;
dp[i][j]=gcd(dp[i][j-1],dp[i+qpow(j-1)][j-1]);
}
}
return;
}
int suan(int x,int y){
double s=y-x+1;
int ke=log2(s);
int he=qpow(int(log2(s)));
return gcd(dp[x][ke],dp[y-he+1][ke]);
}
void erfen(int n){
mp.clear();
for(int i=1;i<=n;i++){
int g=dp[i][0],j=i;
while(j<=n){
int l=j,r=n;
while(l<r){
int mid=(l+r+1)/2;
if (suan(i,mid)==g)l=mid;
else r=mid-1;
}
mp[g]+=r-j+1;
j=l+1;
g=suan(i,j);
}
}
}
int main(){
int n,t,q,x,y,w;
scanf("%d",&t);
for(int wohaocai=1;wohaocai<=t;wohaocai++){
printf("Case #%d:\n",wohaocai);
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&dp[i][0]);
}
st(n);
erfen(n);
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d",&x,&y);
if(y<x){
int t=x;x=y;y=t;
}
int k=suan(x,y);
printf("%d %lld\n",k,mp[k]);
}
}
return 0;
}

HDU5726:GCD——题解的更多相关文章

  1. 洛谷 P2568 GCD 题解

    原题链接 庆祝一下:数论紫题达成成就! 第一道数论紫题.写个题解庆祝一下吧. 简要题意:求 \[\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)==p] \] 其中 \(p\) ...

  2. HDU5726 GCD(二分 + ST表)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...

  3. BZOJ2820:YY的GCD——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2820 Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

  4. CC DGCD:Dynamic GCD——题解

    https://vjudge.net/problem/CodeChef-DGCD https://www.codechef.com/problems/DGCD 题目大意: 给一颗带点权的树,两个操作: ...

  5. HDU5726 GCD

    Give you a sequence of N(N≤100,000)N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000)a1,...,an( ...

  6. hdu-5726 GCD(rmq)

    题目链接: GCD Time Limit: 10000/5000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Prob ...

  7. CH 4302 Interval GCD 题解

    题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...

  8. gcd 题解

    gcd Little White learned the greatest common divisor, so she plan to solve a problem: given \(x, n,\ ...

  9. [洛谷2257]YY的GCD 题解

    整理题目转化为数学语言 题目要我们求: \[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)=p]\] 其中 \[p\in\text{质数集合}\] 这样表示显然不是很好,所以我们需 ...

随机推荐

  1. python处理dict转json,字符串中存在空格问题,导致url编码时,存在多余字符

    在进行urlencode转换请求的参数时,一直多出一个空格,导致请求参数不正确,多了一个空格,解决方法一种是将dict中key-value键值对的value直接定义为字符串,另一种是value仍然为字 ...

  2. 【转载】2015Android 面试题 01

    1.如何避免ANR? 答:ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应. 当出现下列情况时,Andr ...

  3. Kali渗透测试工具-netcat

    netcat被称作是网络工具当中的瑞士军刀,短小却功能强大 1.端口扫描 nc -nvz 目标IP 端口范围 eg: nc -nvz 192.168.1.105 1-65535 -n参数是不要使用DN ...

  4. 基于Kubernetes(k8s)网络方案演进

    VIP PaaS在接近两年时间里,基于kubernetes主要经历四次网络方案的变迁: 1. kubernetes + flannel 2. 基于Docker libnetwork的网络定制 3. k ...

  5. Eclipse安装颜色主题,个性化你的IDE,让你的IDE焕然一新

    我们都知道eclipse默认的颜色主题是白色的背景,但是如果想改变代码编辑区的背景颜色,需要怎么办呢? 今天给大家介绍一个非常赞的eclipse,可以很方便的根据自己的需求选择喜欢的颜色主题,其他的不 ...

  6. [leetcode-693-Binary Number with Alternating Bits]

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...

  7. 第十六次ScrumMeeting会议

    第十六次Scrum Meeting 时间:2017/12/6 地点:线上+SPR咖啡馆 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 照片: 目前工作进展 名字 今日 明天的工作 遇到 ...

  8. 如果jsp表单元素的值为空,如何避免null出现在页面上?

    可以写一个简单的函数对空值进行处理,判断值是否为空,如果是空就返回空字符串.实例代码如下: <%! String blanknull(String s) { return (s == null) ...

  9. # 团队作业MD

    队员姓名与学号 051501124 王彬(组长) 111500206 赵畅 031602215 胡展瑞 031602320 李恒达 031602131 佘岳昕 031602431 王源 0316022 ...

  10. Tomcat服务器学习和使用(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...