NOIP 2023 模拟赛 20230712 C 论剑
首先是伟大的题面
然后是数据范围
先解决1-4号数据点
1.枚举每个gcd的值p,统计一次答案,得到最小值(期望得分20)
\]
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 论剑的更多相关文章
- NOIP前模拟赛总结
NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...
- NOIP一系列模拟赛小结
NOIP越发接近了,于是自己也跟着机房的几位师兄一起做了几次NOIP模拟赛,收获颇多. #1-T1:求点集中的点能否只用三条与坐标轴平行的直线就能全部被经过,其实只要将横纵坐标排序后逐个点检查下就行. ...
- NOIP欢乐模拟赛 T1 解题报告
小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...
- LUOGU NOIP 2018 模拟赛 DAY1
T1 传送门 解题思路 这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了. #include<iostream> #include&l ...
- 【NOIP考前模拟赛】纯数学方法推导——旅行者问题
一.写在前面 这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:http://pan.baidu.com/s/1mibdMXi),诸位看官需者自取. ...
- NOIP欢乐模拟赛 T3 解题报告
3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...
- NOIP欢乐模拟赛 T2 解题报告
小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...
- JXOJ 9.7 NOIP 放松模拟赛 总结
比赛链接 T1 数数 题意:有a个红球,b个黄球,c个蓝球,d个绿球排成一列,求任意相邻不同色的排列的数目 1 <= a , b, c, d <= 30 答案对1e9 + 7 取膜 用 ...
- 6.19noip模拟赛总结
昨天进行了noip的模拟赛,我这个蒟蒻又是垫底.... T1 第一感觉就是贪心,从高到低排序,然后每次都将恰好满足当前条件的人数分成一组,然后移动到下一个未分组的单位上,贴代码 #include< ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
随机推荐
- Vue的项目打包为移动端(安卓手机应用)app
现在基于vue全家桶技术体系,基本上可以开发各端的各种应用,pc端的应用,开发完成以后,直接运行打包命令 yarn build 即可打包,部署到服务器端上线即可.那么,今天我们来聊一聊,开发好的vue ...
- python自产调试工具pdb的使用
python自产调试工具pdb的使用 介绍 调试打印在写代码的时候不可避免 项目越大,调试可能花的时间会越多 print调试可能是最早用的,一段时间内你都会习惯这种方式 一旦成了老鸟,你应该会去用ID ...
- Prometheus-Operator使用ServiceMonitor监控配置时遇坑与解决总结
摘要 本文范围: Prometheus-Operator & kube-prometheus 安装:以及在解决使用ServiceMonitor时遇到的坑. Prometheus Operato ...
- 【Redis】常用命令介绍
一.Redis常用基本命令 官方文档:https://redis.io/commands/ 参考文档:http://redisdoc.com/ #可以使用help命令查看各redis命令用法[root ...
- Java动态调用实体的get方法
/** * 动态调用实体的get方法(注意返回值) * @param dto 实体 * @param name 动态拼接字段 * @return {@link String} * @date 2021 ...
- 2023-04-26:给定一个数组componets,长度为A, componets[i] = j,代表i类型的任务需要耗时j 给定一个二维数组orders,长度为M, orders[i][0]代表i
2023-04-26:给定一个数组componets,长度为A, componets[i] = j,代表i类型的任务需要耗时j 给定一个二维数组orders,长度为M, orders[i][0]代表i ...
- 2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串
2022-01-24:K 距离间隔重排字符串. 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k. 所有输入的字符串 ...
- vue全家桶进阶之路19:webpack资源打包工具
Vue.js 是一个前端开发框架,它可以帮助我们快速构建单页应用和复杂的交互界面.而 Webpack 则是一个前端资源打包工具,它可以将多个 JavaScript.CSS.HTML.图片等资源打包成一 ...
- 如何使用C++ 在Word文档中创建列表
列表分类是指在Word文档中使用不同格式排序的列表,来帮助我们一目了然地表达出一段文字的主要内容.比如,当我们描述了某个主题的若干点,就可以用列表把它们一一表达出来,而不是写成完整的段落形式.同时,列 ...
- hexrays sdk study
There are 20 examples in /ida_path/plugins/hexrays_sdk/plugins, you can learn from that, you can als ...