数据结构_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

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int p[100002] = {0};
 5 int left[100002] = {0};
 6 int right[100002] = {0};
 7
 8 void swap(int &a, int &b)
 9 {
10     a ^= b;
11     b ^= a;
12     a ^= b;
13 }
14
15 int Getgcd(int n, int m)
16 {
17     if (n < m) swap(n, m);
18     return n%m == 0 ? m : Getgcd(m, n%m);
19 }
20
21 int main()
22 {
23 //    freopen("test.txt","r",stdin);
24     int n, i, j;
25     scanf("%d", &n);
26 //    int *p = (int *)malloc(sizeof(int)*n);
27     for (i = 0; i < n; i++)
28         scanf("%d", p + i);
29
30     int gcd = -1;
31     for(i=0; i<n; i++) //for(i=0;i<n-1;i++)
32     {
33         if(i==0)
34             gcd = p[0];
35         else
36             gcd = Getgcd(p[i],left[i-1]);
37         left[i] = gcd;
38     }
39     for(i=n-1; i>=0; i--) //for(i=n-1;i>0;i--)
40     {
41         if(i==n-1)
42             gcd = p[n-1];
43         else
44             gcd = Getgcd(p[i],right[i+1]);
45         right[i] = gcd;
46     }
47
48     int maxgcd = -1;
49     for(i=0; i<n; i++) // except p[i]
50     {
51         if(i==0)
52             gcd = right[1];
53         else if(i==n-1)
54             gcd = left[n-2];
55         else
56             gcd = Getgcd(left[i-1],right[i+1]);
57         if(gcd>maxgcd) maxgcd = gcd;
58     }
59     printf("%d\n",maxgcd);
60
61 //    free(p);
62     return 0;
63 }
时间: 2024-08-24 17:41:53

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

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

4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 188  Solved: 110[Submit][Status][Discuss] Description 你知道什么是"互质序列"吗?那就是所有数的最大公约数恰好为1的序列. "互质序列"非常容易找到,但是我们可以尝试通过删除这个序列的一个非空连续子序列来扩大它的最大公约数. 现在给定一个长度为n的序列,你需要从中删除一个非空连

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

问题描述 如果一个序列的元素的异或和等于 1,我们称这个序列为优雅的序列.现在给你一个 01 序列,和 m 次询问.对于每次询问,给出 l,r.请你输出子序列 a[l..r]的异或和. ★数据输入输入第一行为正整数 n, m.第二行为 n 个正整数 a[1..n]. (1<=ai<=10^9)接下来的 m 行,每行两个数 l,r. (1<=l<=r<=n)80%的数据 1<=n,m<=1000.100%的数据 1<=n,m<=100000. ★数据输出

HDU5668 Circle 非互质中国剩余定理

分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然不要忘了判无解的情况. 有非常多选手似乎都是一眼标算然后写挂了,对此表示很遗憾,但是此题确实是比较容易写挂的... 注:中国剩余定理 解模线性方程组的时候 有两种情况 1:一种是模数是两辆互质的,这样的题可以用LRJ白书上的模板,俗称CRT1 2:模数存在不互质的,这样的需要用合并方程的做法,俗称C

BestCoder Round #80 1004 hdu 5668 中国剩余定理(m不互质版)

链接:戳这里 Circle Time Limit: 2000/1000 MS (Java/Others)   Memory Limit: 65536/65536 K (Java/Others) 问题描述 \ \ \ \     Fye对约瑟夫游戏十分着迷. \ \ \ \     她找到了n个同学,把他们围成一个圈,让他们做约瑟夫游戏,然后她得到了一个同学们出圈的编号序列.游戏是这样进行的:以同学1为起点,开始计数,计数到第k个同学,该同学出圈.出圈的同学将不参与之后的计数. \ \ \ \  

NYOJ154 聪明的小珂 【互质】

聪明的小珂 时间限制:1000 ms  |  内存限制:1000 KB 难度:3 描写叙述 小珂是一个爱美的女孩.她有n条新项链.标号从1到n.每一条项链在颜色上都会有一些区别,n条项链依次摆放,围成一个圈.小珂每次都会从上一次选择项链的位置開始数到第k条项链,把这条项链作为今天要带的项链,每次数的方向都是一致的.如今希望你帮小珂计算出一个最大的k,满足k<=n/2的同一时候,使得小珂在接下来的n天中将全部的项链都刚好带了一遍. 比如 n=7.取k=3 天数  项链编号 1           

互质 整除 同余

互质 当(a,b)=1时,称a.b互质(素) 性质: 1.已知(a,c)=1,若a|bc,则a|b:若a|b,c|b,则ac|b 2.p为素数,若p|ab,则p|a或p|b 3.[a,b]*(a,b)=ab 4.(a,b)=(a,b-ac)=(a-bc,b) 5.存在整数x.y,使得ax+by=(a,b) 6.m(a,b)=(ma,mb) 7.若a|m,b|m,则[a,b]|m 8.m[a,b]=[ma,mb] 整除 设a,b为整数,a≠0,若有一整数q,使得b=aq,则称a是b的因数,b为a的

Hello Kiki(中国剩余定理——不互质的情况)

Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 247 Accepted Submission(s): 107   Problem Description One day I was shopping in the supermarket. There was a cashier counting coins serio

(hdu step 7.2.2)GCD Again(欧拉函数的简单应用——求[1,n)中与n不互质的元素的个数)

题目: GCD Again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 125 Accepted Submission(s): 84   Problem Description Do you have spent some time to think and try to solve those unsolved problem afte

容斥原理 求M以内有多少个跟N是互质的

开始系统的学习容斥原理!通常我们求1-n中与n互质的数的个数都是用欧拉函数! 但如果n比较大或者是求1-m中与n互质的数的个数等等问题,要想时间效率高的话还是用容斥原理! 本题是求[a,b]中与n互质的数的个数,可以转换成求[1,b]中与n互质的数个数减去[1,a-1]与n互质的数的个数. #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define LL long