CF1305F Kuroni and the Punishment
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相关推荐
- Ozon Tech Challenge 2020 (Div.1 + Div.2) F. Kuroni and the Punishment 随机化
传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每次操作可以选择将某个数+1,−1+1,-1+1,−1,求最少进行多少次操作使得所有数都为正数且gcd>1gcd>1gcd> ...
- 【随机】Kuroni and the Punishment(CF1305F)
正题 luogu CF1305F 题目大意 给你n个数,每次操作可以使一个数+1或-1,让你用最小的操作数使所有数的gcd>1 解题思路 显然把所有数都修改为偶数可以得到 2|gcd,且步数 ≤ ...
- Codeforces 1305F Kuroni and the Punishment (随机化)
题目链接 https://codeforces.com/contest/1305/problem/F 题解 真的想不出--然而大家都会 考虑枚举最终所有数的 \(\gcd\),设为 \(g\). \( ...
- 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 ...
- CF刷题——2500难度的几道题
1.D. Beautiful numbers 题意:Beautiful Numbers定义为这个数能整除它的所有位上非零整数.问[l,r]之间的Beautiful Numbers的个数. 数位 DP: ...
- 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 ...
- 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 ...
- 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 ...
- Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated) D. Kuroni and the Celebration 交互 + 思维
传送门 文章目录 题意: 思路: 题意: 给你一颗树,每次可以询问两个点的lcalcalca,询问次数不能超过⌊n2⌋\left \lfloor \frac{n}{2} \right \rfloor⌊ ...
最新文章
- SpringBoot-高级-检索-整合SpringDataElasticsearch
- java readline最后一行_java – 如何在reader.readLine()中检测第一行和最后一行?
- “ 紫手环的力量 ” :我想,美好的生活应该是自已造就的...
- pipreqs 组件
- R语言之——字符串处理函数
- 兴业银行研发中心笔试题_2021国考笔试成绩即将发布,面试重点考什么?
- linux 多线程超时中断,c#中的线程超时
- 自适应阵列信号处理(自适应波束形成)综述
- 代码实现自动剪辑视频
- 计算机组成原理罗克露课后答案,计算机组成原理[完整版](罗克露)(全)原版教案.ppt...
- mac brew 启动服务时报错“Bootstrap failed: 5: Input/output error”
- moc 文件自动生成
- 游戏数据库服务器 数据缓存 增量更新
- h5做app和原生app有什么区别?
- nginx-ingress设置日志格式-配置转发真实ip-超时参数配置-会话保持参数
- 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)
- PC历史上的20位英雄
- 访问者模式Visitor
- 矛与盾的较量(2)——CRC原理篇
- 瑞康医药携手亚马逊云科技,推动云上医药创新
热门文章
- 研究表明:喝酒“上脸”是基因突变,不仅容易老年痴呆,还容易得胃癌
- 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
- 为什么程序员发现不了自己的BUG?
- 服务器 不支持gbk,解决JS请求服务器gbk文件乱码的问题
- redis下载+php,php+redis实现消息队列
- linux文件目录的管理,Linux文件目录管理
- linux内核线程socket,从Linux源码看Socket(TCP)的accept
- cas 4.2.7 官方手册_海城市地区,保险手册核验的简单流程
- acwing2041. 干草堆(差分数组)
- linux退出lftp命令,lftp命令使用