首页 > 编程语言 >Codeforces 1305 F Kuroni and the Punishment 题解 (随机算法)

Codeforces 1305 F Kuroni and the Punishment 题解 (随机算法)

时间:2023-01-08 16:35:06浏览次数:70  
标签:1305 rep 题解 质数 Kuroni 随机 check define

题目链接

首先注意到每个数最多操作1次就能让他变成2的倍数,所以答案\(\le n\)。如果我们能枚举[1,1e12]中所有的质数,并对每个质数p求出把数组中所有数都变成它的倍数的最少步数\(c_p\),那就能求出答案了。但是质数太多了不能一个个枚举。令\(c_p\)最小的质数为P,如果有多个最小的则任取一个。显然在\(a_1,a_2\cdots a_n\)中,有至少一半能够用0或1步变成P的倍数,也就是\(P|a_i或P|a_i-1或P|a_i+1\)。如果我们随机选一个位置i,并对\(a_i,a_i-1,a_i+1\)的所有质因数x求出\(c_x\)并更新答案,有\(\frac 12\)的概率查到P并得到最优解。所以随机个几十次找不到最优解的概率就很小了。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pdd pair <double,double>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back

void fileio()
{
  #ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  #endif
}
void termin()
{
  #ifdef LGS
  std::cout<<"\n\nEXECUTION TERMINATED";
  #endif
  exit(0);
}

using namespace std;

mt19937 rnd(114514);
LL n,a[200010],ans=1e18;

void checkP(LL val)
{
  LL ret=0;
  rep(i,n)
  {
    LL dv=a[i]%val,res=min(dv,val-dv);
    if(a[i]<val) res=val-a[i];
    ret+=res;
  }
  ans=min(ans,ret);
}
void check(LL val)
{
  for(LL i=2;i*i<=val;++i) if(val%i==0)
  {
    while(val%i==0) val/=i;
    checkP(i);
  }
  if(val>1) checkP(val);
}

int main()
{
  fileio();

  cin>>n;
  rep(i,n) scanf("%lld",&a[i]);
  rep(ti,50)
  {
    LL i=rnd()%n;
    check(a[i]);check(a[i]+1);
    if(a[i]>1) check(a[i]-1); 
  }
  cout<<ans<<endl;

  termin();
}

标签:1305,rep,题解,质数,Kuroni,随机,check,define
From: https://www.cnblogs.com/legendstane/p/codeforces-1305-f-solution.html

相关文章

  • 【题解】P5666 [CSP-S2019] 树的重心
    感觉对重心的理解更直观了一点。题意求一棵树上删去每一条边后两侧子树重心的编号和。\(n\leq3\times10^5\)思路神奇的清真数论。首先这里有一步很妙的操作:把整......
  • LeetCode 887. 鸡蛋掉落-题解分析
    题目来源887.鸡蛋掉落题目详情给你k枚相同的鸡蛋,并可以使用一栋从第1层到第n层共有n层楼的建筑。已知存在楼层f,满足 0<=f<=n,任何从高于f的楼层落......
  • P3829 题解
    题目传送门二维凸包模板传送门题目分析类似于凸包模板的一道题。我们循序渐进地考虑,当半径\(r=0\)时,显然是一个二位凸包模板。接着我们将圆弧加进去,仔细观察发现,我......
  • SYUCT第五次限时训练题解
    第五次限时训练题目大意及ac代码Maxmina题目大意accode#include<iostream>usingnamespacestd;intT,n,m;inta[55];intmain(){cin>>T;whil......
  • Atcoder ABC 284题解
    DHappyNewYear2023(枚举,时间复杂度计算)题意​ 给定\(n\\le\9\times10^{18}\),给出式子\(n=p^2\timesq\),该式子必定有解且有唯一解。请输出\(p\)和\(q\)......
  • Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
    题目链接弱化版(其实完全一样)u1s1,洛谷上这题的第一个题解写得很不错,可以参考直接边讲Polya定理边做这题问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色,如果两......
  • Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
    题目链接弱化版(其实完全一样)u1s1,洛谷上这题的第一个题解写得很不错,可以参考直接边讲Polya定理边做这题问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色,如果两......
  • 【青少年CTF】Crypto-easy 题解小集合
    Crypto-easy1.BASE拿到附件用cyberchef自动解码得到flag2.basic-crypto拿到附件发现是一串01的数字,这时候想到二进制转换然后base64在线解码接着根据提示想到凯撒......
  • 洛谷-P8932 题解
    正文♦时间复杂度:\(\mathcal{O}(|S|+q)\)找规律的题。我们先来研究三组数据:abcd,答案是2;aa,答案是1;ccffab,答案是2。以下称将一个子串按题意每个字符双倍的......
  • CF1007A 题解
    题目传送门题目分析贪心水题。首先将原数组从小往大排序,然后不难想到一个简单但会超时的思路,即对每个位置,向后找到一个比自己大的数进行搭配。然后是一个简单的小优化,......