coprime_sequence(互质序列)

问题描述

  顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列。比如[1,2,3],
[4,7,8],都是互质序列。 [3,6,9]不是互质序列。现在并不要求你找出一个互质
序列,那样太简单了!真正的问题描述是:给定一个序列,删除其中一个元素使
得剩下元素的 gcd 最大,输出这个 gcd。

★数据输入

  输入第一行为一个正整数 n。 第二行为 n 个正整数 ai(1<=ai<=10^9)。
80%的数据 2<=n<=1000.
100%的数据 2<=n<=100000.

★数据输出
  输出一个正整数,表示最大的 gcd。

输入示例 输出示例
3
1 1 1
1
输入示例 输出示例
5
2 2 2 3 2
2
输入示例 输出示例
4
1 2 4 8
2

★Hint
  最大公因数缩写是 gcd。 gcd(a,b,c)=gcd(a,gcd(b,c)).

解题思路

  暴力算法小规模可以,但是复杂度达到O(n^2),大规模数据超时。因此必须采用更好的算法。

  期初,我的想法是将从左到右算过的数据存下来,即开一个数组,将第1个数的gcd(本身)存在第1个位置,将第1~2个数的gcd存在第2个位置,1~3个数的gcd存在第3个位置,以此类推。

  而其中第1~n个数的gcd可由gcd(    1~(n-1)的gcd  ,  第n个数 )求得    是递推的过程,复杂度O(n)。

  但仅仅这样只比暴力节省一半时间。因此,仿照前面的过程,引入从右到左的gcd计算

  开等长数组left[] right[] ,将 从左到右 和 从右到左 的gcd递推计算结果分别存入left[] 与right[]

  那么除掉下标为 i 的数,其他数的为gcd( left[i-1] , right[i+1])    首尾做特殊判断

  这样遍历一遍,就能找到gcd_max

code

 #include <stdio.h>
#include <stdlib.h> int p[] = {};
int left[] = {};
int right[] = {}; void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
} int Getgcd(int n, int m)
{
if (n < m) swap(n, m);
return n%m == ? m : Getgcd(m, n%m);
} int main()
{
// freopen("test.txt","r",stdin);
int n, i, j;
scanf("%d", &n);
// int *p = (int *)malloc(sizeof(int)*n);
for (i = ; i < n; i++)
scanf("%d", p + i); int gcd = -;
for(i=; i<n; i++) //for(i=0;i<n-1;i++)
{
if(i==)
gcd = p[];
else
gcd = Getgcd(p[i],left[i-]);
left[i] = gcd;
}
for(i=n-; i>=; i--) //for(i=n-1;i>0;i--)
{
if(i==n-)
gcd = p[n-];
else
gcd = Getgcd(p[i],right[i+]);
right[i] = gcd;
} int maxgcd = -;
for(i=; i<n; i++) // except p[i]
{
if(i==)
gcd = right[];
else if(i==n-)
gcd = left[n-];
else
gcd = Getgcd(left[i-],right[i+]);
if(gcd>maxgcd) maxgcd = gcd;
}
printf("%d\n",maxgcd); // free(p);
return ;
}

数据结构_coprime_sequence(互质序列)的更多相关文章

  1. bzoj 4921: [Lydsy六月月赛]互质序列

    4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 188  Solved: 110[Submit][Status ...

  2. Codeforces 959 树构造 暴力求最小字典序互质序列

    A B C 题目给你一个结论 最少需要min((odd,even)个结点可以把一棵树的全部边连起来 要求你输出两颗树 一棵树结论是正确的 另外一棵结论是正确的 正确结论的树很好造 主要是错误的树 题目 ...

  3. 【bzoj4921】[Lydsy六月月赛]互质序列 暴力

    题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...

  4. BZOJ4921「Lydsy1706月赛」互质序列

    吐槽一下BZOJ没有C++11  题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...

  5. BZOJ4921 互质序列

    即求删掉一个子序列的gcd之和.注意到前后缀gcd的变化次数都是log级的,于是暴力枚举前缀gcd和后缀gcd即可. #include<iostream> #include<cstd ...

  6. [BZOJ 4921][Lydsy1706月赛]互质序列

    传送门 因为区间 gcd 的变换不会超过 log 个,所以我们可以暴力枚举区间起点,复杂度是 n*logn 的 #include <bits/stdc++.h> using namespa ...

  7. 数据结构 elegant_sequence(优雅的序列)

    数据结构 elegant_sequence(优雅的序列) 问题描述 如果一个序列的元素的异或和等于 1,我们称这个序列为优雅的序列.现在给你一个 01 序列,和 m 次询问.对于每次询问,给出 l,r ...

  8. HDU5668 Circle 非互质中国剩余定理

    分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然 ...

  9. hdoj1014 互质

    Uniform Generator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. JavaScript6 新语法 let 有什么优势

    最近看国外的前端代码时,发现ES6的新特性已经相当普及,尤其是 let,应用非常普遍 虽然 let 的用法与 var 相同,但不管是语法语义上,还是性能上,都提升了很多,下面就从这两方面对比一下 语法 ...

  2. 仿百度下拉关键词,和关键词的小demo

    自己做项目时用到的仿百度下拉关键词 代码: $(function(){ var oTxt = document.getElementById('search_text'); oTxt.onkeyup ...

  3. 服务监控Zabbix和Nagios的继任者

    本文转载自:https://blog.csdn.net/moonpure/article/details/78633668 为了调研市场,从而做出更好的监控工具,David Gildeh 曾采访了超过 ...

  4. 我的MyGeneration

    话不多说,直接上代码 Interface Code: public class GeneratedGui : DotNetScriptGui { public GeneratedGui(ZeusCon ...

  5. HAproxy+Mycat

    haproxy+mycat搭建haproxy server 10.0.1.134mycat server 10.0.1.134,10.0.1.135mysql master 10.0.1.134mys ...

  6. 自定义数据校验(4)---demo3---bai

    工具类:CharUtil package com.etc.util; import java.util.regex.Pattern; public class CharUtil { public st ...

  7. vue-cli脚手架build目录中的dev-server.js配置文件

    本文系统讲解vue-cli脚手架build目录中的dev-server.js配置文件 这个配置文件是命令npm run dev 和 npm run start 的入口配置文件,主要用于开发环境 由于这 ...

  8. Eclipse与github整合完整版

    最近朋友都推荐使用github管理自己的项目,而且免费用户可以有5个仓库,恰好我也想了解下git,借此机会学习一下. github官方指南使用独立第三方git工具来进行版本控制,并不借助于eclips ...

  9. 【转载】基于TINY4412的Andorid开发-------简单的LED灯控制

    阅读目录(Content) 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源 ...

  10. Spring注解-TaskScheduler

    一.定义配置类 import org.springframework.context.annotation.ComponentScan; import org.springframework.cont ...