CodeForces 1305F Kuroni and the Punishment
时间:2020-05-28
本文章向大家介绍CodeForces 1305F Kuroni and the Punishment,主要包括CodeForces 1305F Kuroni and the Punishment使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
CodeForces 1305F Kuroni and the Punishment
https://codeforces.com/contest/1305/problem/F
长度为 \(n\) 的正整数序列 \(a_1,a_2,\cdots,a_n\) ,一次操作可以选择一个 \(a_i\) 并对其+1或-1且满足操作后 \(a_i\) 仍为正整数.
问最少需要多少次操作才可以使序列的gcd不为1
\(2 \le n \le 2 \times 10^5,1 \le a_i \le 10^{12}\)
Tutorial
如果我们选择一个素数 \(d\) 表示最后的gcd为 \(d\) 的倍数,那么很容易可以在 \(O(n)\) 的时间内计算出这样的答案.现在我们需要检验可能为答案的 \(d\) .
考虑当 \(d=2\) 时,答案最多为 \(n\) ,所以对于最优的 \(d\) ,操作次数 \(>1\) 的 \(a_i\) 数量不超过 \(\lfloor \dfrac n2 \rfloor\) .
所以如果我们随机一个 \(a_i\) ,用 \(a_i-1,a_i,a_i+1\) 的所有质因子作为 \(d\) 进行检验,那么有 \(\dfrac 12\) 的几率得到正确答案.
则我们随机 \(T=20\) 个 \(a_i\) 进行检验,最后WA的概率为 \(2^{-20}\) .足以得到AC
设 \(A=\max\{a_i\}\) ,则时间复杂度为 \(O(T(\sqrt A + n \log A))\) .
Code
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define fi first
#define se second
using namespace std;
template<class T> inline bool Cmin(T &x,T y) {return x>y?x=y,1:0;}
typedef unsigned long long ull;
typedef long long ll;
const ll inf=1e18;
const int maxn=2e5+50;
ll an;
ll a[maxn];
int n;
map<ll,int> prime;
inline ull Rand()
{
static ull seed=0;
seed^=rand();
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
void work(ll x)
{
if(x==0) return;
for(int i=2;i<=x/i;++i) if(x%i==0)
{
prime[i]=1;
while(x%i==0) x/=i;
}
if(x>1) prime[x]=1;
}
ll sol(ll x)
{
ll an=0;
for(int i=1;i<=n;++i)
{
if(a[i]<=x) an+=x-a[i];
else an+=min(a[i]%x,x-a[i]%x);
}
return an;
}
int main()
{
srand((unsigned long long)(new char));
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%I64d",&a[i]);
}
ll an=inf;
int T=20; while(T--)
{
int x=Rand()%n+1;
prime.clear();
work(a[x]),work(a[x]-1),work(a[x]+1);
for(map<ll,int>::iterator it=prime.begin();it!=prime.end();++it)
{
Cmin(an,sol(it->fi));
}
}
printf("%I64d\n",an);
return 0;
}
原文地址:https://www.cnblogs.com/ljzalc1022/p/12972346.html
- 什么情况?又出新规定,微信支付和支付宝支付居然要被限额了?
- 三十分钟掌握STL
- 谷歌AI新升级,装备审美功能给照片评分
- 【设计模式】—— 适配器模式Adapter
- 【设计模式】—— 单例模式Singleton
- 【Spring实战】—— 3 使用facotry-method创建单例Bean总结
- JS面向对象高级特性
- 图解闭包
- 【web必知必会】——图解HTTP(上)
- 【web必知必会】—— 图解HTTP(下)
- 【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取
- 【AngularJS】—— 4 表达式
- 【AngularJS】—— 5 表单
- 【AngularJS】—— 1 初识AngularJs
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- tp5框架使用cookie加密算法实现登录功能示例
- python实现停车管理系统
- 浅谈Pycharm调用同级目录下的py脚本bug
- Python中logging.NullHandler 的使用教程
- Python中利用aiohttp制作异步爬虫及简单应用
- Linux内核设备驱动之系统调用笔记整理
- python3实现名片管理系统
- Linux IO多路复用之epoll网络编程
- 浅谈python在提示符下使用open打开文件失败的原因及解决方法
- Linux内核设备驱动之内核的调试技术笔记整理
- Python检查和同步本地时间(北京时间)的实现方法
- thinkPHP5.1框架使用SemanticUI实现分页功能示例
- python实现名片管理系统
- Python unittest 简单实现参数化的方法
- CentOS7部署Flask(Apache、mod_wsgi、Python36、venv)