Kuroni and the Punishment CodeForces - 1305F 随机函数mt19937 + 质因子分解
题意:
给你n个数,你每次操作可以对一个数加1或者减1,让你求你最少需要操作多少次可以使这n个数的公因子大于1
题解:
正常方法就是枚举质因子(假设质因子为x),然后对于这个数组中的数a[i],让a[i]变成x的倍数的最小操作数为:
1、如果a[i]不为0
答案为:min(a[i]%x,x-a[i]%x)
2、a[i]为0
答案为:x
后面的思路参考博客:https://blog.csdn.net/qq_41818939/article/details/104658566
假设最大公约数为2时,每个数最多只需要操作一次就可以了,所以操作次数最多为n。所以需要操作次数≤1的数的数量≥n/2。
一个数x操作次数≤1时候会变成x,x+1,x-1三种情况,所以我们可以随机一下需要操作次数≤1的数,这时候随机不到这种数的概率
就是1/2T,T的数字大了之后概率就很小了,几乎不可能了。对每个随机到的数我们直接判断他的三种情况,每种情况就是枚举
他的质因子,然后暴力计算需要操作的次数,最后取最小值就行了。
复杂度为O(T*(sqrt(max)+n*log(max)))。
代码:
1 /*
2 (神奇的随机算法)
3 假设最大公约数为2时,每个数最多只需要操作一次就可以了,所以操作次数最多为n。所以需要操作次数≤1的数的数量≥n/2。
4 一个数x操作次数≤1时候会变成x,x+1,x-1三种情况,所以我们可以随机一下需要操作次数≤1的数,这时候随机不到这种数的概率
5 就是1/2T,T的数字大了之后概率就很小了,几乎不可能了。对每个随机到的数我们直接判断他的三种情况,每种情况就是枚举
6 他的质因子,然后暴力计算需要操作的次数,最后取最小值就行了。
7 复杂度为O(T*(sqrt(max)+n*log(max)))。
8 ————————————————
9 原文链接:https://blog.csdn.net/qq_41818939/java/article/details/104658566
10 */
11 #include<bits/stdc++.h>
12 using namespace std;
13 typedef long long ll;
14 mt19937 rng_32(chrono::steady_clock::now().time_since_epoch().count());
15 ll a[200005];
16 int n;
17 ll cal_ans(ll x)
18 {
19 ll ret=0;
20 for (int i=0;i<n;i++)
21 {
22 ll tmp=a[i]%x;
23 /*防止出现0
24 如果a[i]是0,那么tmp也是0
25 这样的话min(tmp,x-tmp)=0
26 但是这样肯定是错的,因为a[i]是0的话,是没有因子的
27
28 */
29 if (a[i]!=tmp)
30 ret+=min(tmp,x-tmp);
31 else
32 ret+=x-tmp;
33 }
34 return ret;
35 }
36 //计算质因子
37 ll fac(ll x)
38 {
39 ll ret=1e18;
40 ll en=sqrt(x+1ll);
41 for(ll i=2;i<=en;i++)
42 {
43 if (x%i==0)
44 {
45 ret=min(ret,cal_ans(i));
46 while(x%i==0)
47 x/=i;
48 if (x==1)
49 break;
50 }
51 }
52 if (x>1)
53 ret=min(ret,cal_ans(x));
54 return ret;
55 }
56 int main()
57 {
58 //printf("%d\n",(0%5));
59 cin>>n;
60 for (int i=0;i<n;i++)
61 scanf("%I64d",&a[i]);
62 int T=10;
63 ll ans=1e18;
64 while (T--)
65 {
66 ll pos=rng_32()%n;
67 //处理三种情况
68 if (a[pos]>2)
69 ans=min(ans,fac(a[pos]-1ll));
70 ans=min(ans,fac(a[pos]));
71 ans=min(ans,fac(a[pos]+1ll));
72 }
73 cout<<ans;
74 }
Kuroni and the Punishment CodeForces - 1305F 随机函数mt19937 + 质因子分解的更多相关文章
- CodeForces 577A Multiplication Table 质因子数
题目:click here 题意:看hint就懂了 分析:数论小题,在n0.5时间里求n的质因子数 #include <bits/stdc++.h> using namespace std ...
- Codeforces - 151C 质因子分解
显然只需要能跑到第二个因子就赢了 需要特判非平凡因子 常数优化:不用求出所有因子,跑完第二个素数就行了 #include<bits/stdc++.h> using namespace st ...
- Codeforces 杂题集 2.0
记录一些没有写在其他随笔中的 Codeforces 杂题, 以 Problemset 题号排序 1326D2 - Prefix-Suffix Palindrome (Hard version) ...
- Codeforces 893E - Counting Arrays
893E - Counting Arrays 思路:质因子分解. 对于每个质因子,假设它有k个,那么求把它分配到y个数上的方案数. 相当于把k个小球分配到y个盒子里的方案数. 这个问题可以用隔板法(插 ...
- Codeforces 959D. Mahmoud and Ehab and another array construction task(构造, 简单数论)
Codeforces 959D. Mahmoud and Ehab and another array construction task 题意 构造一个任意两个数都互质的序列,使其字典序大等于a序列 ...
- Relatively Prime Powers CodeForces - 1036F (莫比乌斯函数容斥)
Relatively Prime Powers CodeForces - 1036F Consider some positive integer xx. Its prime factorizatio ...
- Codeforces Round #671 (Div. 2)
比赛链接:https://codeforces.com/contest/1419 A. Digit Game 题意 给出一个 $n$ 位数,游戏规则如下: 1-indexed Raze标记奇数位 Br ...
- 刷题记录:Codeforces Round #725 (Div. 3)
Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
随机推荐
- python学习笔记 | 猜拳游戏
''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...
- wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序
环境Win10 VS2019 .Net Framework4.8 在wpf中,如果为一个DataGrid绑定到一个数据源,默认情况下DataGrid会为数据源类型的每个属性生成一个列(Column)对 ...
- Kaggle泰坦尼克-Python(建模完整流程,小白学习用)
参考Kernels里面评论较高的一篇文章,整理作者解决整个问题的过程,梳理该篇是用以了解到整个完整的建模过程,如何思考问题,处理问题,过程中又为何下那样或者这样的结论等! 最后得分并不是特别高,只是到 ...
- 【Oracle LISTNER】oracle Listener 宕机解决办法
今天想起了很久没用的oracle库,用plsql尝试连接,发现报超时错误,以为是偶然,多次尝试连接,发现还是超时,于是登录到系统中,查看数据库情况,发现正常查询和修改添加,感觉不是数据库问题,查看监听 ...
- C语言逗号运算符(C语言学习笔记)
什么是逗号运算符 逗号运算符 逗号运算符是指在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值. 用法 多个变量赋值 原因:"=& ...
- ctfhub技能树—信息泄露—git泄露—Stash
打开靶机环境 查看页面内容 使用dirsearch进行扫描 使用Githack工具处理git泄露情况 进入.git/refs目录 发现stash文件,使用notepad++打开文件 使用git dif ...
- os.walk() 遍历目录下的文件夹和文件
os.walk(top, topdown=True, onerror=None, followlinks=False) top:顶级目录 os.walk()返回一个三元tupple(dirpath, ...
- Windows系统使用运行框运行程序
配置步骤 1. 在非系统盘创建一个新文件夹,自定义名称.将需要使用运行框启动的程序或文件放入文件夹,并将其更改为自己容易记忆的名称 2. 创建环境变量 右击 "此电脑" → &qu ...
- 用 UniRx 实现 Timeline 式的异步操作
没接触 UniRx 之前,我在 Unity 中通常用 Coroutine 或 Callback 来实现异步操作.根据我的任务,一般都是去实现游戏组件的演出,比如:敌方角色图形显示后,我方角色 UI ...
- Eclipse中给jar包导入JavaDoc的方法
原文转载自:http://blog.csdn.net/mr_von/article/details/7740138 在使用Java语言开发的过程中,开发人员经常需要用到一些开源的工具包.在使用别人的j ...