CF1305F Kuroni and the Punishment

题意:

给定 n 个数。每次可以选择将一个数 +1 或 -1 。求至少多少次操作使得整个序列都是正数且全部元素的 gcd>1 。
n<=2e5,ai<=1012n<=2e5,a_{i}<=10^{12}n<=2e5,ai​<=1012

题解:

首先不难想到,我们可以让所有数变成偶数,这样gcd为2,这样的话,每个数的操作次数小于等于1,这是答案的上界n,也就是最后的答案只会比n优,不可能比n劣
由上面这个结论我可以推出一个定理:在最终的方案中,指定存在至少一半的元素,他们最多被操作过一次
证明:如果存在一般元素被操作了超过一次,那么操作次数就是⌈n+12⌉∗2>n\lceil \frac{n+1}{2}\rceil*2>n⌈2n+1​⌉∗2>n,这超过了答案上界
所以,如果我们随机选任意元素,这个元素至少有12\frac{1}{2}21​的概率被最多操作一次。对于数x最多操作一次,可以得到x-1,x,x+1,也就是x最终有这个三个形态。因为gcd要>=2,说明x-1/x/x+1的某个因子就是我们要找的答案,那我们直接因子分解,对于每个因子w去强行判断如果w是gcd所需要的操作次数,然后取min
为什么这样是对的?
我们刚才说了,操作次数小于等于1的概率是>=12\frac{1}{2}21​的,所以我们随机选取k次,那么错误的概率就是12k\frac{1}{2^k}2k1​
当k>=30时一般不会出错
还有随机不要用rand(),详细原因详见如何正确地生成一个随机数

代码:

#include<bits/stdc++.h>
using namespace std;
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
typedef long long ll;
ll a[200005];
int n;
ll cal(ll x)
{ll ret=0;for (int i=0;i<n;i++){ll tmp=a[i]%x;if (a[i]!=tmp)ret+=min(tmp,x-tmp);elseret+=x-tmp;}return ret;
}ll fac(ll x)
{ll ret=1e18;ll en=sqrt(x+1ll);for(ll i=2;i<=en;i++){if (x%i==0){ret=min(ret,cal(i));while(x%i==0)x/=i;if (x==1)break;}}if (x>1)ret=min(ret,cal(x));return ret;
}
int main()
{   srand(time(0));cin>>n;for(int i=0;i<n;i++)scanf("%I64d",&a[i]);int T=50;ll ans=1e18;while (T--){ll pos=rnd()%n;if (a[pos]>2)ans=min(ans,fac(a[pos]-1ll));ans=min(ans,fac(a[pos]));ans=min(ans,fac(a[pos]+1ll));}cout<<ans;
}

CF1305F Kuroni and the Punishment相关推荐

  1. Ozon Tech Challenge 2020 (Div.1 + Div.2) F. Kuroni and the Punishment 随机化

    传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每次操作可以选择将某个数+1,−1+1,-1+1,−1,求最少进行多少次操作使得所有数都为正数且gcd>1gcd>1gcd> ...

  2. 【随机】Kuroni and the Punishment(CF1305F)

    正题 luogu CF1305F 题目大意 给你n个数,每次操作可以使一个数+1或-1,让你用最小的操作数使所有数的gcd>1 解题思路 显然把所有数都修改为偶数可以得到 2|gcd,且步数 ≤ ...

  3. Codeforces 1305F Kuroni and the Punishment (随机化)

    题目链接 https://codeforces.com/contest/1305/problem/F 题解 真的想不出--然而大家都会 考虑枚举最终所有数的 \(\gcd\),设为 \(g\). \( ...

  4. Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!)

    Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated, T-shirts + prizes!) 题号 题目 知识点 A Kuroni and the Gifts ...

  5. CF刷题——2500难度的几道题

    1.D. Beautiful numbers 题意:Beautiful Numbers定义为这个数能整除它的所有位上非零整数.问[l,r]之间的Beautiful Numbers的个数. 数位 DP: ...

  6. Kuroni and Impossible Calculation CodeForces - 1305C(鸽巢原理)

    To become the king of Codeforces, Kuroni has to solve the following problem. He is given n numbers a ...

  7. Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)

    To become the king of Codeforces, Kuroni has to solve the following problem. He is given n numbers a ...

  8. Ozon Tech Challenge 2020 (Div.1 + Div.2) E.Kuroni and the Score Distribution 构造

    传送门 文章目录 题意: 思路: 题意: 思路: 不难想到,长度为nnn的数组最多的满足条件的三元组序列是1,2,3....,n1,2,3....,n1,2,3....,n,对于每一个位置贡献为i−1 ...

  9. Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated) D. Kuroni and the Celebration 交互 + 思维

    传送门 文章目录 题意: 思路: 题意: 给你一颗树,每次可以询问两个点的lcalcalca,询问次数不能超过⌊n2⌋\left \lfloor \frac{n}{2} \right \rfloor⌊ ...

最新文章

  1. SpringBoot-高级-检索-整合SpringDataElasticsearch
  2. java readline最后一行_java – 如何在reader.readLine()中检测第一行和最后一行?
  3. “ 紫手环的力量 ” :我想,美好的生活应该是自已造就的...
  4. pipreqs 组件
  5. R语言之——字符串处理函数
  6. 兴业银行研发中心笔试题_2021国考笔试成绩即将发布,面试重点考什么?
  7. linux 多线程超时中断,c#中的线程超时
  8. 自适应阵列信号处理(自适应波束形成)综述
  9. 代码实现自动剪辑视频
  10. 计算机组成原理罗克露课后答案,计算机组成原理[完整版](罗克露)(全)原版教案.ppt...
  11. mac brew 启动服务时报错“Bootstrap failed: 5: Input/output error”
  12. moc 文件自动生成
  13. 游戏数据库服务器 数据缓存 增量更新
  14. h5做app和原生app有什么区别?
  15. nginx-ingress设置日志格式-配置转发真实ip-超时参数配置-会话保持参数
  16. 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)
  17. PC历史上的20位英雄
  18. 访问者模式Visitor
  19. 矛与盾的较量(2)——CRC原理篇
  20. 瑞康医药携手亚马逊云科技,推动云上医药创新

热门文章

  1. 研究表明:喝酒“上脸”是基因突变,不仅容易老年痴呆,还容易得胃癌
  2. 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
  3. 为什么程序员发现不了自己的BUG?
  4. 服务器 不支持gbk,解决JS请求服务器gbk文件乱码的问题
  5. redis下载+php,php+redis实现消息队列
  6. linux文件目录的管理,Linux文件目录管理
  7. linux内核线程socket,从Linux源码看Socket(TCP)的accept
  8. cas 4.2.7 官方手册_海城市地区,保险手册核验的简单流程
  9. acwing2041. 干草堆(差分数组)
  10. linux退出lftp命令,lftp命令使用