xsy 1845 - GCD
from NOIP2016模拟题34
Description
给定一个长度\(n\le 10^6\)的序列, 给定\(A, B\)
给出一个序列,要求你通过如下两个操作使得序列中所有数的最大公约数大于1,每个操作最多使用一次
1:删除一段连续的数,代价为删除的长度$*A $
2:将任意多个数+1或-1,代价为 \(B *\)数的个数
Analysis
由于删除也至少留下一个数
最后的gcd一定是a[1]-1,a[1],a[1]+1,a[n]-1,a[n],a[n]+1六个数中
某个数的质因数的倍数
Solution
考虑每个可能的质因数:
two_pointer搞出删除的区间
其他用修改操作
预处理出哪些数必须修改chg[i]
哪些数必须删除must[i]
若对当前two_pointer区间
修改要修改的数优于区间删除
就将左区间右移一下
two_pointer移的时候要保证合法
Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int M=1000007;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
int n;
int a[M];
int fac[M*12],cnt=0;
LL A,B;
LL chg[M];
LL must[M];
LL ans=9223372036854775807;
void solve(int p){
int i,l,r;
for(i=1;i<=n;i++){
chg[i]=must[i]=0;
if (a[i] % p == 0) continue;
if((a[i]+1)%p==0||(a[i]-1)%p==0) chg[i]=1;
else if(a[i]%p) must[i]=1;
}
for(i=1;i<=n;i++) chg[i]+=chg[i-1];
for(i=1;i<=n;i++) must[i]+=must[i-1];
for(l=1,r=1;r<=n;r++){//two_pointer求删除区间
if(must[n]-must[r]) continue;//不合法
if(l==1&&r==n) l=2;//不能全删
while(l<=r&&must[l]==0&&(chg[r]-chg[l-1])*B<=(r-l+1)*A) l++;//更优且移动和合法
ans=min(ans,(chg[l-1]+chg[n]-chg[r])*B+(r-l+1)*A);
}
}
void split(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0) fac[++cnt]=i;
while(x%i==0) x/=i;
}
if(x>2) fac[++cnt]=x;
}
int main(){
int i;
n=rd(),A=rd(),B=rd();
for(i=1;i<=n;i++) a[i]=rd();
split(a[1]); split(a[1]-1); split(a[1]+1);
split(a[n]); split(a[n]-1); split(a[n]+1);
sort(fac+1,fac+cnt+1);
cnt=unique(fac+1,fac+cnt+1)-(fac+1);
for(i=1;i<=cnt;i++)
solve(fac[i]);
printf("%lld\n",ans);
return 0;
}
xsy 1845 - GCD的更多相关文章
- POJ 1845 (约数和+二分等比数列求和)
题目链接: http://poj.org/problem?id=1845 题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1) ...
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- GCD的相关函数使用
GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
随机推荐
- c++链表-双向链表+增删查改
基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...
- java基础—static关键字
一.static关键字
- 【转】本人常用资源整理(ing...)
Deep Learning(深度学习): ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习):一 ufldl的2个教程(这个没得说,入门绝对的好教程,Ng的,逻辑清晰有练习) ...
- Bootstrap 模态框 禁止点击空白关闭模态框事件
在模态框的div中加上 aria-hidden="true" data-backdrop="static" <div class="modal ...
- Linux 文本编辑常用快捷键
一.编辑模式 vim有三种编辑模式 1. i 进入文本编辑模式 2. esc 进入命令编辑模式 命令编辑状态下 dd删除整行 3. :进入底行模式 底行模式状态 输入q 退出 w保存 wq 保存并 ...
- 《linux设备驱动开发详解》笔记——10中断与时钟
10.1 中断与定时器 中断一般有如下类型: 内部中断和外部中断:内部中断来自CPU,例如软件中断指令.溢出.除0错误等:外部中断有外部设备触发 可屏蔽中断和不可屏蔽中断 向量中断和非向量中断,ARM ...
- 什么是python中的元类
所属网站分类: python高级 > 面向对象 作者:goodbody 原文链接: http://www.pythonheidong.com/blog/article/11/ 来源:python ...
- 循环字典进行操作时出现:RuntimeError: dictionary changed size during iteration的解决方案
在做对员工信息增删改查这个作业时,有一个需求是通过用户输入的id删除用户信息.我把用户信息从文件提取出来储存在了字典里,其中key是用户id,value是用户的其他信息.在循环字典的时候,当用户id和 ...
- LeetCode(226)Invert Binary Tree
题目 分析 交换二叉树的左右子树. 递归非递归两种方法实现. AC代码 class Solution { public: //递归实现 TreeNode* invertTree(TreeNode* r ...
- 算法学习记录-查找——二叉排序树(Binary Sort Tree)
二叉排序树 也称为 二叉查找数. 它具有以下性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 它的左.右子树也分别 ...