首先是伟大的题面



然后是数据范围

先解决1-4号数据点

1.枚举每个gcd的值p,统计一次答案,得到最小值(期望得分20)

\[ans=\min_{p=2}^{\max a}\sum^n_{i=1}\min(a_i \bmod p,p-(a_i \bmod p)(a>p ))
\]

2.我们可以发现p仅在为质数时不会重复,也可以将p换为质数(期望得分40)

两种的时间复杂度:

1.$$O(n\max a)$$

2.$$O(nP(\max a))$$

博主比较蒟蒻,只会带log的求质数,所以复杂度为\(O(n\log(\max a))\),也可以拿到40

(实际上我只枚举到1000,但还是用40分的代码拿到80分)

继续发呆思考

可以发现gcd为2时,每个\(a_i\)只需要+1或-1(\(a_i\neq 1\))

答案不会超过n

惊人的发现:

修改的次数超过1的最多有\(\frac n 2\)个(可以用反证法证明,若修改超过1的超过\(\frac n 2\)个则答案会大于n)

我们又可以得到修改次数不超过1的(即修改次数为1的)大于\(\frac n 2\)个

有什么用呢?没有什么用

如果我们找到了修改次数不超过1的,那它修改后可能为\(a_i-1(a\neq1)、a_i、a_i+1\),而答案的质因数就在里面

我们只需要预处理出质数,求出\(a_i-1(a\neq1)、a_i、a_i+1\)的所有质因数,每个像1、2中那样跑一遍,即可求出答案

复杂度\(O(n)\),如此优秀,直接碾过去

什么,万一这个不是修改不超过1的数?没关系,抽到的概率至少大于50%,稳赚不亏

保守的办法是枚举\(\frac n 2 +1\)个数,但复杂度又变回了\(O(n^2P(a_i))\)运气不好甚至没有40分,所以我说没有用

既然提到了“保守”,那肯定有“激进”的方法

看眼复杂度,如果\(n^2\)可以变为\(n\log n\),那就可以有惊无险的通过这道题

那我们就抽\(\log n\)个数,每个跑一次上述的方法

这就是正解了,但不完全正解(

可以想到,如果抽到的数中,没有一个是我们想要的,那就可以喜提“WA”了

算下概率

每次选择都有至少一半的概率,总共抽\(\log n\)次

概率为\(1-\frac 1 {n^{\log n}}\),在后面几个点中\(\log n\)大概为20左右遇到可以买彩票了

这个概率是很低的,根据“能AC的就是正解”,可以知道这就是一个正经的正解

WARN:前几个点n较小时会出现\(\log n\)较小的情况,可能会喜提彩票一等奖

所以我们要给选的数的个数设置个下界,或者将选的个数直接定为20左右

喜闻乐见的代码时间:

哦,对了,为了防止万恶的脑洞比较大的出题人将前面几个数全部设为不满足的数

我们可以加入随机数,或者直接看RP(

博主的超长代码
#include<bits/stdc++.h>
#define fo(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define Ts template<typename Ty,typename... Ar>
#define Tp template<typename Ty>
#define isdigit(c) ((c)>='0'&&(c)<='9')
#define ll long long
#define RS register
#define gc getchar
#define pc putchar
#define I inline
using namespace std;
Tp I Ty wmax(Ty a,Ty b){return a>=b? a:b;}
Tp I Ty wmin(Ty a,Ty b){return a<=b? a:b;}
namespace WrongIO
{
Tp I void read(Ty &x){x=0;Ty opt=1;char c=gc();while(!isdigit(c)&&c!='-')c=gc();if(c=='-')opt=-1,c=gc();while(isdigit(c))x=(x<<3)+(x<<1),x+=c-'0',c=gc();x*=opt;return;}
Tp I void write(Ty x){short OI_USE[50],OI_top=0;if(x<=0) if(x==0)pc('0');else pc('-'),x*=-1;while(x)OI_USE[++OI_top]=x%10,x/=10;while(OI_top--)pc(OI_USE[OI_top+1]+'0');return;}
I void writec(char c[]){int len=strlen(c);for(int i=0;i<len;i++)pc(c[i]);}
I void writes(string s){int len=s.length();for(int i=0;i<len;i++)pc(s[i]);}
I void readc(char &c,int l,int r){c=gc(); while(c!=EOF&&(c<l||c>r)) c=gc();}
I void readc(char &c,char val){c=gc();while(c!=EOF&&c!=val) c=gc();}
I void readc(char val){char c;c=gc();while(c!=EOF&&c!=val) c=gc();}
I void readls(string &s){char c=gc();while(c!='\n') s.push_back(c),c=gc();}
Ts I void read(Ty &x,Ar &...y) {read(x),read(y...);}
} using namespace WrongIO;
ll n,e[200050],ans=1e12;
ll zs[1000050],tp;
void check(ll vl)
{
ll ta=0;
for(int i=1;i<=n;i++)
{
if(e[i]<vl) ta+=vl-e[i];
else ta+=wmin(e[i]%vl,vl-(e[i]%vl));
}
if(ta<ans) ans=ta;
return;
}
void Work(ll x)
{
bool flag=1;
for(int j=2;j<=sqrt(x);j++)
{
if(x%j==0)
{
flag=0;
break;
}
}
if(flag==1&&x!=1) check(x);
for(int i=1;i<=tp;i++)
{
if(zs[i]>x) return;
x%zs[i]==0&&(check(zs[i]),0);
}
return;
}
int main()
{ read(n);
for(int i=1;i<=n;i++) read(e[i]);
for(int i=2;i<=1000001;i++)
{
bool flag=1;
for(int j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1) zs[++tp]=i;
}
ll ED=25; srand(43543);
for(int i=1;i<=ED;i++)
{
ll ez=rand()%n+1;
ll ee=e[ez];
ee!=1&&(Work(ee-1),0);
Work(ee);
Work(ee+1);
}
write(ans);
return 0;
}
以及给出巨佬兼命题人的cxr的超短代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
#define V 1000000
#define LL long long
using namespace std;
int n;LL a[N+5],p[N*30];set<LL> vis;
namespace FastIO
{
#define FS 100000
#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
char oc,FI[FS],*FA=FI,*FB=FI;
Tp I void read(Ty& x) {x=0;W(!isdigit(oc=tc()));W(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}using namespace FastIO;
int Pt,P[V+5];I void Sieve() {for(RI i=2,j;i<=V;++i)
for(!P[i]&&(P[++Pt]=i),j=1;j<=Pt&&i*P[j]<=V;++j) if(P[i*P[j]]=1,!(i%P[j])) break;}
int ans;I void Check(Con LL& x)
{
if(vis.find(x)!=vis.end()) return;vis.insert(x);
LL res=0;for(RI i=1;i<=n&&res<ans;++i) res+=a[i]<x?x-a[i]:min(a[i]%x,x-a[i]%x);
ans>res&&(ans=res);
}
I void Work(LL x)
{
for(RI i=1;i<=Pt&&P[i]<=x;++i) if(!(x%P[i])) {Check(P[i]);W(!(x%P[i])) x/=P[i];}
x^1&&(Check(x),0);
}
int main()
{
RI T,i;LL x;for(srand(998244353),Sieve(),read(n),i=1;i<=n;++i) read(a[i]);
for(ans=n,T=1;T<=30;++T) x=a[1ull*rand()*rand()*rand()%n+1],Work(x),Work(x+1),x^1&&(Work(x-1),0);
return printf("%d\n",ans),0;
}

蒟蒻的第一遍题解,全是文字不是还有两张题面吗,非常不好

给上样例

输入1

3

1 3 9

输出1

2

输入2

3

1001 1999 3000

输出2

2

样例3(太大了)

放不下

NOIP 2023 模拟赛 20230712 C 论剑的更多相关文章

  1. NOIP前模拟赛总结

    NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...

  2. NOIP一系列模拟赛小结

    NOIP越发接近了,于是自己也跟着机房的几位师兄一起做了几次NOIP模拟赛,收获颇多. #1-T1:求点集中的点能否只用三条与坐标轴平行的直线就能全部被经过,其实只要将横纵坐标排序后逐个点检查下就行. ...

  3. NOIP欢乐模拟赛 T1 解题报告

    小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...

  4. LUOGU NOIP 2018 模拟赛 DAY1

    T1 传送门 解题思路 这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了. #include<iostream> #include&l ...

  5. 【NOIP考前模拟赛】纯数学方法推导——旅行者问题

    一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取. ...

  6. NOIP欢乐模拟赛 T3 解题报告

    3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...

  7. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  8. JXOJ 9.7 NOIP 放松模拟赛 总结

    比赛链接 T1 数数 题意:有a个红球,b个黄球,c个蓝球,d个绿球排成一列,求任意相邻不同色的排列的数目 ​ 1 <= a , b, c, d <= 30 答案对1e9 + 7 取膜 用 ...

  9. 6.19noip模拟赛总结

    昨天进行了noip的模拟赛,我这个蒟蒻又是垫底.... T1 第一感觉就是贪心,从高到低排序,然后每次都将恰好满足当前条件的人数分成一组,然后移动到下一个未分组的单位上,贴代码 #include< ...

  10. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

随机推荐

  1. 【图解算法使用C++】1.2 生活中的算法

    图解算法使用C++ 一.计算思维与程序设计 1.2 生活中到处都是算法 计算最大公约数(辗转相除法) // C++ #include<iostream> #include<stdio ...

  2. TCP/IP网络模型

    在网络模型中有分为7层模型(OSI模型)和5层模型和TCP/IP模型 OSI模型将应用层和表示层作为独立的两层,而TCP/IP模型将它们合并为一个应用层. 两种对比来说,TCP/IP模型更符合实际开发 ...

  3. Selenium - 浏览器配置(1) - 忽略证书错误提示

    Selenium - 浏览器配置 忽略证书错误提示 有时候我们访问一些地址,会提示证书私密连接告警信息如下: 如果我们每次要点击高级来忽略私密连接,那就很麻烦: 在谷歌浏览器可以增加忽略证书错误问题, ...

  4. SICP:元循环求值器(Python实现)

    求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看.这里顺便强烈推荐UC Berkeley的同名课程CS 61A. 在这个层次结构的最底层是对象语言.对象语言只 ...

  5. linux 管理进程和计划任务

    目录 一.进程原理 二.进程工作过程 三.进程类型 四.管理进程 五.前后台调度 六.定时任务 七.管理定时任务 一.进程原理 进程:指正在运行的程序称之为进程 程序:指的是没有运行的代码 线程:真正 ...

  6. 2022年第十四届四川省大学生程序设计大赛 A

    A Adjacent Swapping 题意: 给定一个字符串,每次可以移动相邻字符,求最小移动次数可以把它变成s+s这样左右两边相同的字符串. 思路: 1:我们知道他一定是偶数长度,所以我们把字符串 ...

  7. 用R来分析洛杉矶犯罪

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 洛杉矶市(Los Angeles)或"爵士乐的诞生地(The Birthplace ...

  8. Python进行大文件的备份

    Python进行大文件的备份的思路:每次仅从原文件中读取指定字符的内容后写入新文件,然后循环操作. def copy_big_file(): # 接收用户输入的文件名 old_file = input ...

  9. JIRA安装

    JIRA安装 操作系统: 阿里云centos6.8 域名: yan.jzhsc.com 1.安装与配置JAVA sudo -u root -H bash # 在oracle官网下载JDK,安装并配置环 ...

  10. Tab切换以及倒计时组件封装

    1.Tab组件 功能 支持默认选中tab 子元素可以是文本或者图片 自定义tab的数量,并自适应展示 实现方式 用ul > li标签遍历传入的tabs数组参数渲染 判断是否传入背景,未传则显示文 ...