[AGC010D] Decrementing

news/2024/10/21 11:38:43

首先考虑最简单的情况,如果有一个数是 \(1\),那么第二步没有作用,胜负是固定的,先判掉。

然后发现题目给了一个很奇怪的条件:所有数的最大公约数为 \(1\),也就是至少有一个奇数,这提示我们从奇偶数下手。

发现第二步中的最大公约数的奇数因子是毫无意义的,因为无论是奇数还是偶数除以一个奇数,奇偶性都不变,没有改变第一步操作次数的奇偶性。

这给了先手一种必胜的思路,如果只进行第一步,先手必胜,先手又能保证两人每一次第二步中的最大公约数为奇数就必胜。

先手只需要每一次随便选一个偶数减 \(1\),由于初始至少有一个奇数,所以后手操作的时候至少有两个奇数,最大公约数一定为奇数,先手的操作最大公约数就更显然是奇数了。

这种情况的初始条件是只进行第一步先手必胜,也就是偶数个数为奇数。

如果只进行第一步先手必败呢?这时候先手肯定不能留给后手奇数,否则后手采用前面的方法必胜。所以先手只有一种选择,第一步删奇数。

如果初始奇数的个数大于 \(1\),那么先手删不完所有的奇数,后手必胜。

到现在,我们有三种判定了:

  • 如果有 \(1\) 直接判定
  • 如果有奇数个偶数先手必胜
  • 如果有偶数个偶数并且有大于一个奇数后手必胜

如果恰好有偶数个偶数而且只有一个奇数,先手会删那个奇数,直接模拟这一次操作将奇数减 \(1\),这时所有的数都为偶数,最小公因数最小为 \(2\),最多进行 \(log\) 次就会变成上面三种情况的一种。

单次模拟时间复杂度为 \(O(nloga)\),总时间复杂度为 \(O(nlog^{2}a)\)

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
int a[N];
int ji,ou,now=1,sum=0;
bool flag=false;void change(){for(int i=1;i<=n;i++){if(a[i]&1) a[i]--;}int gcd=a[1];for(int i=2;i<=n;i++) gcd=__gcd(gcd,a[i]);for(int i=1;i<=n;i++) a[i]/=gcd;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]&1) ji++;else ou++;if(a[i]==1) flag=true;sum+=(a[i]-1);}if(flag){if(sum&1) cout<<"First";else cout<<"Second";return 0;}if(ou&1){cout<<"First";return 0;}else if(!(ou&1) && ji>1){cout<<"Second";return 0;}while(1){now=3-now;change();ji=ou=0;sum=0;for(int i=1;i<=n;i++){if(a[i]&1) ji++;else ou++;if(a[i]==1) flag=true;sum+=(a[i]-1);}if(flag){if(!(sum&1)) now=3-now;break;}if(ou&1){break;}else if(!(ou&1) && ji>1){now=3-now;break;}}if(now==1) cout<<"First";else cout<<"Second";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Linux模块

ansible-doc -l:查看ansible系统的模块 ansible-doc 加模块名 :具体查看那个模块 ansible-doc -s 加模块名 :具体查看那个模块 ansible重要常用模块命令模块:command shell script文件模块:file copy安装模块:yum服务模块:service定时模块:cron挂载模块:mount…

Python中的深拷贝与浅拷贝

目录1. 可变对象和不可变对象2. 用=赋值的问题3. copy模块登场4. 重新认识列表对象5. 浅拷贝,深拷贝浅拷贝(copy.copy())一维列表的浅拷贝深拷贝(copy.deepcopy())浅拷贝,深拷贝,直接赋值的区别 1. 可变对象和不可变对象 在 Python 中,数据类型可以分为两大类:可变对象和…

015 时间==事件修饰符

例如prevent对click进行修饰,阻止点击后跳转链接的默认行为其他一些较常用的

小学班级海报

这张图片是一张庆祝国际劳动节的海报,充满了节日的喜庆与对劳动者的崇高敬意。 海报的背景以红色为主色调,象征着热情与活力,营造出一种积极向上的氛围。在海报中央,一个巨大的红色数字“5”与“劳动节”的字样相结合,形成了鲜明的视觉焦点,让人一眼就能感受到节日的主题…

一键生成黑神话悟空小红书封面+文案,抓住流量,狠狠赚一笔!

前段时间,一款名为《黑神话:悟空》的单机游戏爆火出圈,关于它的消息几乎刷爆了所有的社交媒体。 虽然很多人对游戏不感冒,但你仍然可以抓住热点,发周边内容来狠狠地赚一笔。快手、抖音、小红书等各个平台流量都很火爆,比如有人制作了悟空的时装走秀视频:还有其他博主搞出…

更快的辅助生成: 动态推测

更快的辅助生成: 动态推测 ⭐ 在这篇博客文章中,我们将探讨 动态推测解码 ——这是由英特尔实验室和 Hugging Face 开发的一种新方法,可以加速文本生成高达 2.7 倍,具体取决于任务。从 Transformers🤗 发布的版本 4.45.0 开始,这种方法是辅助生成的默认模式⭐ 推测解码 推…