数据结构_coprime_sequence(互质序列)
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(互质序列)的更多相关文章
- bzoj 4921: [Lydsy六月月赛]互质序列
4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 188 Solved: 110[Submit][Status ...
- Codeforces 959 树构造 暴力求最小字典序互质序列
A B C 题目给你一个结论 最少需要min((odd,even)个结点可以把一棵树的全部边连起来 要求你输出两颗树 一棵树结论是正确的 另外一棵结论是正确的 正确结论的树很好造 主要是错误的树 题目 ...
- 【bzoj4921】[Lydsy六月月赛]互质序列 暴力
题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...
- BZOJ4921「Lydsy1706月赛」互质序列
吐槽一下BZOJ没有C++11 题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...
- BZOJ4921 互质序列
即求删掉一个子序列的gcd之和.注意到前后缀gcd的变化次数都是log级的,于是暴力枚举前缀gcd和后缀gcd即可. #include<iostream> #include<cstd ...
- [BZOJ 4921][Lydsy1706月赛]互质序列
传送门 因为区间 gcd 的变换不会超过 log 个,所以我们可以暴力枚举区间起点,复杂度是 n*logn 的 #include <bits/stdc++.h> using namespa ...
- 数据结构 elegant_sequence(优雅的序列)
数据结构 elegant_sequence(优雅的序列) 问题描述 如果一个序列的元素的异或和等于 1,我们称这个序列为优雅的序列.现在给你一个 01 序列,和 m 次询问.对于每次询问,给出 l,r ...
- HDU5668 Circle 非互质中国剩余定理
分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然 ...
- hdoj1014 互质
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- Ubuntu16.04上安装搜狗输入法
一.下载搜狗输入法的deb包: http://pinyin.sogou.com/linux/ 二.打开终端输入命令: $ sudo dpkg -i sogoupinyin_2.0.0.0078_i38 ...
- UVA - 11107 Life Forms (广义后缀自动机)
题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出. 对这n个字符串建广义后缀自动机,建完后每个字符串在自动机上跑一遍,沿fail树向上更新所有子串结点的出现次数( ...
- 获取url参数并且中文不乱码的方法
function getUrlArgument(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)
环境说明:版本 version 5.6.25-log 主库ip: 10.219.24.25从库ip:10.219.24.22os 版本: centos 6.7已安装热备软件:xtrabackup 防火 ...
- WPF中ToolTip的自定义
ToolTip或者PopUp这个控件在做界面时会经常用到.如何对ToolTip进行自定义呢? 1.首先自定义tooltip的controlTemplate,完全清除系统默认效果, 如下: ...
- wpf控件提示Value ‘’ can not convert
我们在对控件的ErrorTemplate设置后,有时会出现Value '' can not convert. 为什么会出现呢? 原因:如果控件的输入值和null不能转换(比如控件要求的是int或flo ...
- 设置Nodejs NPM全局路径
Windows下的Nodejs npm路径是appdata 在nodejs的安装目录中找到node_modules\npm\.npmrc文件 修改如下即可: prefix = E:\nodejs\np ...
- Java-API:java.math.BigDecimal
ylbtech-Java-API:java.math.BigDecimal 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. https://docs.ora ...
- c# 实用精华知识点全解
本文介绍c#的实用知识点 写在前面(通识) vs常用快捷键 F5 调试运行程序 ctrl F5 不调试运行程序 F11 逐条语句调试 F10 逐过程调试程序 注释快捷键 ctrl + k + c 代码 ...
- IIS安装与部署,站点的部署与配置
第一章:IIS安装与部署 一,服务器概念的理解: 将设计好的软件只要部署到一台机器(服务器--->IIS)上,其它的员工通过浏览器(网址.)来进行访问. 做好的网站必须部署到这台机器上的IIS中 ...