【NOIP2014模拟8.17】Magical GCD

题目

对于一个由正整数组成的序列, Magical GCD 是指一个区间的长度乘以该区间内所有数字的最大公约数。给你一个序列,求出这个序列最大的 Magical GCD。

分析

根据暴力的思想,
\(枚举i,枚举j,a[j]=gcd(a[j],a[i])\)
答案就是\(max(a[j]*(i-j+1))\)
显然,当\(a[j]=a[j-1]\)的时候,\(a[j]\)就一定不会更新ans,所以,弄个双向链表,把\(a[j]\)踢掉。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=100005;
using namespace std;
long long a[N],n,m,T,p,q,last[N],next[N],ans;
long long gcd(long long x,long long y)
{
    if(x!=0) return gcd(y%x,x);
    else return y;
}
int main()
{
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld",&n);
        next[0]=1;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            last[i]=i-1;
            next[i]=i+1;
        }
        last[1]=next[n]=0;
        ans=0;
        for(int i=1;i<=n;i++)
            for(int j=next[0];j<=i && j;j=next[j])
            {
                a[j]=gcd(a[j],a[i]);
                ans=max(a[j]*(i-j+1),ans);
                if(a[j]==a[last[j]])
                {
                    next[last[j]]=next[j];
                    last[next[j]]=last[j];
                }
            }
        printf("%lld\n",ans);
    }
}

原文地址:https://www.cnblogs.com/chen1352/p/9066561.html

时间: 2024-10-31 00:04:38

【NOIP2014模拟8.17】Magical GCD的相关文章

【BZOJ】【4052】【CERC2013】Magical GCD

DP/GCD 然而蒟蒻并不会做…… Orz @lct1999神犇 首先我们肯定是要枚举下端点的……嗯就枚举右端点吧…… 那么对于不同的GCD,对应的左端点最多有log(a[i])个:因为每次gcd缩小,至少变成gcd/2(2是最小的质因数),所以是log个左端点…… 所以我们就有了log段!每段的gcd是相同的.当我们加入一个新的右端点时,除了该节点本身外,不会出现新的左端点,原有的左端点可能会不变,或是两(多)段合并成一段,用滚动数组记一下,暴力搞就可以了……$O(n*log^2n)$ Orz

4052: [Cerc2013]Magical GCD

4052: [Cerc2013]Magical GCD Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 148  Solved: 70[Submit][Status][Discuss] Description 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12. 求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大. Input Output Sample Input 1 5 30 60 20 20 2

Cisco PT模拟实验(17) 路由器IP访问控制列表配置

Cisco PT模拟实验(17) 路由器IP访问控制列表配置 实验目的: 理解两种IP访问控制列表的原理及功能 掌握常见IP访问控制列表的配置方法 实验背景: 公司的经理部.财务部们和销售部门分属于不同的3个网段,三部门之间用路由器进行信息传递,为了安全起见,公司领导要求销售部门不能对财务部进行访问,但经理部可以对财务部进行访问. 技术原理: 路由器能提供防火墙的功能,根据一些预设置的ACL过滤规则对任何经过接口的流量进行过滤,说明哪些具体的通信(来自设备.协议或端口等)是被允许或拒绝,该功能是

【BZOJ4052】[Cerc2013]Magical GCD 乱搞

[BZOJ4052][Cerc2013]Magical GCD Description 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12. 求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大. Sample Input 1 5 30 60 20 20 20 Sample Output 80 题解:先思考暴力的做法.我们从一个数开始往左扫,将所有使得gcd改变的位置都记录下来.由于gcd的每次改变都至少/2,所以这样的位置不超过log个. 那么我们

UVA 1642 Magical GCD 暴力+簡單數論

枚舉右端點,往前查找左端點.... 右端點一定的話,最多只有log個不同的gcd值, 用一個數組記錄不同的GCD的值,對每個相同的GCD值記錄一下最靠左的位置... 因爲GCD值不是很多所以 移動右端點時暴力統計即可.. 對與樣例: 30 60 20 20 20 從第1個數座右端點開始枚舉  // (gcd,位置) (30,1) 枚舉以第2個數做爲右端點 (30,1) (60,2) 第3個數 (10,1)  (20,2) .... 後面幾個數都是一樣的... 第5個數 (10,1)  (20,2

bzoj 4052: [Cerc2013]Magical GCD

bzoj4488的双倍经验!! 1 #include <bits/stdc++.h> 2 #define LL long long 3 using namespace std; 4 inline LL ra() 5 { 6 LL x=0; char ch=getchar(); 7 while (ch<'0' || ch>'9') ch=getchar(); 8 while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=ge

UVa 1642 (综合) Magical GCD

题意: 给出一个数列,求一个连续的子序列,使得MGCD(i, j) =  该子序列的长度(j-i+1) × 子序列的gcd 最大,并输出这个最大值. 分析: 感觉可能要用优先队列,但貌似也用不上. 但类似地,从左往右枚举右端点,不难发现随着序列长度的增大,其子序列的最大公约数是非递增的.一般情况下,是呈阶梯状递减的.于是我们只要保留相同的gcd中,左端点最小的那个序列(因为相同的gcd里面它的长度最大,MGCD就是最大的). 右端点更新的时候,同时也要更新每个子序列的gcd,然后把重复的gcd的

[BZOJ4052][Cerc2013]Magical GCD

试题描述 给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12. 求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大. 输入 本题为多组数据. 第一行一个整数 T,表示数据组数. 每组数据第一行为一个整数 n,表示序列长度:第二行为 n 个整数表示序列. 输出 对于每组数据,输出 max{ gcd * length } 输入示例 1 5 30 60 20 20 20 输出示例 80 数据规模及约定 见"试题描述" 题解 可以发现,随着子序列

Noip2014模拟赛解题心得【联合权值】

首先说明一下,我是一个刚刚进入oi界不到半年的蒟蒻--半年来,我是仅仅凭着兴趣和决心,在校队的一群dalao中瑟瑟发抖.我做的很多题目都是"苟"出来的,就比如说这次模拟赛中的"联合权值",仅凭暴力只坑了40分. 现在就从这道题目开始分析吧.题目如下: 标题: 联合权值 详情: 输入格式: 第一行包含 1 个整数 n. 接下来 n-1 行,每行包含 2 个用空格隔开的正整数 u.v,表示编号为 u 和编号为 v 的点 之间有边相连. 最后 1 行,包含 n 个正整数,