【bzoj4921】[Lydsy六月月赛]互质序列 暴力
题目描述
给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2。求所有删除方式剩下的数的最大公约数的和。
输入
输出
样例输入
5
3 4 5 2 9
样例输出
14
题解
暴力
显然剩下的一定是左边的一段及右边的一段,可以分别枚举左右的位置。
根据 【bzoj4052】[Cerc2013]Magical GCD 的结论,一个数不断地与其它数取gcd,最多只会有log个不同的结果,因为gcd减少一次至少要除以2。
因此可以预处理出从左到右、从右向左的相同gcd段,然后直接枚举左右的段,考虑有多少个区间,直接乱搞即可。
时间复杂度 $O(n\log n)$
#include <cstdio>
#include <cctype>
#define N 100010
#define mod 998244353
typedef long long ll;
int n , a[N] , lp[35] , lv[35] , lt = 1 , rp[35] , rv[35] , rt = 1;
inline char nc()
{
static char buf[100000] , *p1 , *p2;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;
}
inline int read()
{
int ret = 0; char ch = nc();
while(!isdigit(ch)) ch = nc();
while(isdigit(ch)) ret = ((ret + (ret << 2)) << 1) + (ch ^ '0') , ch = nc();
return ret;
}
int gcd(int a , int b)
{
return b ? gcd(b , a % b) : a;
}
inline ll calc(int a , int b , int c , int d)
{
if(d - c < 4) return 0;
if(b - a >= 2) return 1ll * (a - c) * (d - b);
if(a > d - 3) a = d - 3;
if(b < c + 3) b = c + 3;
return 1ll * (a - c) * (d - b) - 1ll * (a - b + 2) * (a - b + 3) / 2;
}
int main()
{
int i , j , t;
long long ans = 0;
n = read();
for(i = 1 ; i <= n ; i ++ ) a[i] = read();
lp[1] = 1 , lv[1] = a[1];
for(i = 2 ; i <= n ; i ++ )
{
if((t = gcd(lv[lt] , a[i])) == lv[lt]) lp[lt] ++ ;
else lp[++lt] = i , lv[lt] = t;
if(i < n) ans = (ans + lv[lt]) % mod;
}
rp[1] = n , rv[1] = a[n];
for(i = n - 1 ; i ; i -- )
{
if((t = gcd(rv[rt] , a[i])) == rv[rt]) rp[rt] -- ;
else rp[++rt] = i , rv[rt] = t;
if(i > 1) ans = (ans + rv[rt]) % mod;
}
rp[0] = n + 1;
for(i = 1 ; i <= lt ; i ++ )
for(j = 1 ; j <= rt ; j ++ )
ans += gcd(lv[i] , rv[j]) * calc(lp[i] , rp[j] , lp[i - 1] , rp[j - 1]);
printf("%lld\n" , ans % mod);
return 0;
}
【bzoj4921】[Lydsy六月月赛]互质序列 暴力的更多相关文章
- bzoj 4921: [Lydsy六月月赛]互质序列
4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 188 Solved: 110[Submit][Status ...
- [BZOJ 4921][Lydsy1706月赛]互质序列
传送门 因为区间 gcd 的变换不会超过 log 个,所以我们可以暴力枚举区间起点,复杂度是 n*logn 的 #include <bits/stdc++.h> using namespa ...
- 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划
[BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...
- 数据结构_coprime_sequence(互质序列)
coprime_sequence(互质序列) 问题描述 顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列.比如[1,2,3],[4,7,8],都是互质序列. [3,6,9]不是互质序列.现在 ...
- 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并
[BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...
- [BZOJ4920][Lydsy六月月赛]薄饼切割
[BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...
- Codeforces 959 树构造 暴力求最小字典序互质序列
A B C 题目给你一个结论 最少需要min((odd,even)个结点可以把一棵树的全部边连起来 要求你输出两颗树 一棵树结论是正确的 另外一棵结论是正确的 正确结论的树很好造 主要是错误的树 题目 ...
- BZOJ4921「Lydsy1706月赛」互质序列
吐槽一下BZOJ没有C++11 题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...
- BZOJ4921 互质序列
即求删掉一个子序列的gcd之和.注意到前后缀gcd的变化次数都是log级的,于是暴力枚举前缀gcd和后缀gcd即可. #include<iostream> #include<cstd ...
随机推荐
- 青岛Uber司机奖励政策(8月31号~9月6号)
本周的奖励规则如下,请各位司机朋友按照自己的情况查询. 人民优步(People’s Uber) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版 ...
- Please ensure JDK installation is valid and compatible with the current OS
报错如下: Gradle sync failed: Could not run JVM from the selected JDK. Please ensure JDK installation is ...
- 利尔达NB-IOT模块烧写固件的步骤
1. NB-IOT是3个内核,用户开发的是A核,就是应用核,用Eclipse软件打开软件SDK之后,会生成一个bin文件(应用核的bin),现在就是要把bin文件合并到包里面(3个内核的bin),一起 ...
- 【费元星原创】一键安装Hadoo2.7.6 集群完全分布式脚本-完美解决
有Bug 欢迎反馈,我不烦:feiyuanxing@gmail.com 1 #!/bin/bash #@author:feiyuanxing [既然笨到家,就要努力到家] #@date:2017-01 ...
- OSG-基本几何图形
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...
- ajax 个人理解 学习笔记
W:Ajax Q:异步网络请求.无刷新请求数据. W:ajax的实现流程如下: Q: 创建XHR对象 调用open()方法,创建请求 调用send()方法,发送请求 捕获请求状态,判断请求结果 获取数 ...
- 垃圾收集器与内存分配策略(深入理解Java虚拟机)
3.1 概述 垃圾收集器要解决哪些问题? 哪些内存需要回收 什么时候回收 如何回收 引用计数算法:当有一个地方引用,+1,引用失效,-1. 缺点:对象之间相互循环引用的问题. 可达性分析算法: ...
- KVM嵌套虚拟化
1. 检查环境 $ grep -E 'svm|vmx' /proc/cpuinfo ~]# lsmod | grep kvm kvm_intel 170181 0 kvm ...
- 剑指offer-二叉搜索树的后序遍历序列23
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution: def Verif ...
- 讯飞云 API 语音听写 python3 调用例程
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import requests import time import gzip import urllib imp ...