首先是伟大的题面



然后是数据范围

先解决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. ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

    通过 axios.create() 可以创建一个 axios 实例 axiosInstance,参数如下: baseURL:请求前缀 timeout:超时时间 headers:请求头 默认配置: im ...

  2. Ansible中的变量

    Ansible中的变量 目录 Ansible中的变量 变量概述 变量定义的方式 变量的优先级 如何定义变量 playbook中定义变量 vars_file中定义变量 系统内置变量 inventory定义 ...

  3. 2022-10-24:以下go语言代码输出什么?A:3 3;B:3 4;C:0 0;D:0 1。 package main func main() { m := make(map[int]int

    2022-10-24:以下go语言代码输出什么?A:3 3:B:3 4:C:0 0:D:0 1. package main func main() { m := make(map[int]int, 3 ...

  4. 2021-04-25:给定一个数组arr,和一个正数M,返回在arr的子数组在长度不超过M的情况下,求最大的累加和。

    福大大 答案2021-04-25: 前缀和+左大右小的双端队列.时间太晚了,所以写得简单. 代码用golang编写.代码如下: package main import ( "containe ...

  5. vue全家桶进阶之路5:DOM文档对象模型

    一.DOM对象 DOM,全称"DocumentObjectModel(文档对象模型)",它是由W3C组织定义的一个标准. 在前端开发时,我们往往需要在页面某个地方添加一个元素或者删 ...

  6. SQL Server2019 新增字段并设置默认值

    命令: ALTER TABLE 表名 add 列名 数据类型 default 默认值 not null 例如: ALTER TABLE LJEL005H add el_req int default ...

  7. sql server 删除带依赖的列 由于一个或多个对象访问此 列

    --SELECT * FROM LJEL005H--ALTER TABLE LJEL005H add el_req int default 15 not null --消息 5074,级别 16,状态 ...

  8. UCOS II源码分析二

    最近大家都沉浸在找到实习的快乐中,自我充电的时间相对减少了,今天重拾一下ucosii的学习,记录如下: 上一篇文章分析了ucosii源码文件组织结构以及简单介绍了各个文件夹里对应文件的功能,要是对uc ...

  9. SpringMVC使用注解开发

    1.编写web.xml(模板代码) 2.导入springmvc的context和mvc两个依赖,通过context标签可以自动扫描识别包"com.lian.controller"下 ...

  10. K8S in Action 读后感(概念简介)

    一.K8S的用武之地 今天,大型单体应用正被逐渐拆分成小的.可独立运行的组件,我们称之为微服务.微服务彼此之间解耦,所以它们可以被独立开发.部署.升级.伸缩.这使得我们可以对每一个微服务实现快速迭代, ...