当前位置: 首页 > article >正文

【题解】CF2008G

题意翻译

原题链接CF2008G
在这里插入图片描述

思路

  由于操作次数不限,观察到所有操作都是可逆的,所以可以随便搞。然后观察mex函数,发现让所有数在不重复的情况下尽可能地小是最优的(重复就浪费了)。
  
  先不考虑重复和 0 0 0,对于 a 1 , a 2 , . . . a n a_{1}, a_{2},...a_{n} a1,a2,...an,经过无限次互相作差后,由欧几里得算法可知, g c d ( x , y ) = g c d ( x , y − x ) gcd(x, y) = gcd(x, y-x) gcd(x,y)=gcd(x,yx),令 g = g c d ( a 1 , . . . a n ) g=gcd(a_{1},...a_{n}) g=gcd(a1,...an),这些数最终会变成 n n n g g g
  
  然后再调整,避免重复。当 n ≠ 1 n \neq 1 n=1,让两个 g g g相减得到 0 0 0,再把其他多余的 g g g逐个加上去,最终变成 0 , g , . . . , ( n − 1 ) g 0, g, ..., (n-1)g 0,g,...,(n1)g。当 n = 1 n=1 n=1,动不了,特判即可。
  
  最后,计算第 k k k个未出现过的数,观察到 i g ig ig ( i + 1 ) g (i+1)g (i+1)g之间由 g − 1 g-1 g1个数未出现,所以令 m = k / ( g − 1 ) m = k / (g-1) m=k/(g1),即可定位到需要的数大致的位置然后分情况讨论:

  (1) n = = 1 n==1 n==1 g > k − 1 g > k-1 g>k1 ,直接取 0 → k − 1 0 \to k-1 0k1即可。
  (2) n = = 1 n==1 n==1 g ≤ k − 1 g \le k-1 gk1,取 0 , 1 , . . . g − 1 , g + 1 , . . . , k 0, 1, ... g-1, g+1, ..., k 0,1,...g1,g+1,...,k
  (3) g = = 1 g==1 g==1, 直接输出 k − 1 + n k-1+n k1+n。这里特判是为了防止后续计算中 g − 1 = 0 g-1=0 g1=0
  (4) n > 1 n>1 n>1, m > n − 1 m > n-1 m>n1,说明已有的数全部被用上了,直接输出 n + k − 1 n+k-1 n+k1
  (5) n > 1 n>1 n>1, m ≤ n − 1 m \le n-1 mn1, m ∗ ( g − 1 ) = = k m * (g-1) == k m(g1)==k,说明恰好填满空隙,输出 k + m − 1 k+m-1 k+m1
  (6) n > 1 n>1 n>1, m ≤ n − 1 m \le n-1 mn1, m ∗ ( g − 1 ) ≠ k m * (g-1) \neq k m(g1)=k,输出k+m。

  分类有点繁琐,可能有几类可以通过一个式子表达。

代码

#include<bits/stdc++.h>
#define N 200005
using namespace std;
int t, n, k, a[N];
int gcd(int x, int y) {
	if(y == 0) return x;
	return gcd(y, x%y);
}
int main() {
	cin>>t;
	while(t--) {
		cin>>n>>k;
		for(int i=1;i<=n;i++) cin>>a[i];
		int g = a[1];
		for(int i=2;i<=n;i++) g = gcd(g, a[i]);
		// 最优0, g, 2g, ..., (n-1)g   (n != 1)
		if(n == 1) {
			if(g > k-1) cout<<k-1<<endl;
			else cout<<k<<endl;
		} else if(g != 1){
			int m = k / (g-1);  //填满m个间隙 
			if(m > n-1) {
				cout<<k-1+n<<endl;
			} else {
				if(m * (g-1) == k){   // 恰好 
					cout<<k+m-1<<endl;
				} else {
					cout<<k+m<<endl;
				}
			}
		} else {
			// 0, 1, 2, ..., n-1
			cout<<k-1+n<<endl;
		}
	}
} 

http://www.kler.cn/a/300609.html

相关文章:

  • PHP 8.4 安装和升级指南
  • 飞牛 使用docker部署Watchtower 自动更新 Docker 容器
  • LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)
  • [创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。
  • 【21】Word:德国旅游业务❗
  • Vulnhub-Tr0ll靶机笔记
  • 解锁数据的秘密武器:PCA带你走进降维新世界
  • 《黑神话:悟空》被“罕见”网络攻击联想个人网络和数据安全防范
  • Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密
  • AIGC大模型扩图:Sanster/IOPaint(4)
  • 大模型岗位招聘数据分析及可视化
  • 免费爬虫软件“HyperlinkCollector超链采集器v0.1”
  • Day8 | Java框架 | Maven
  • 【EI稳定,马来亚大学主办】2024年计算机与信息安全国际会议(WCCIS 2024,9月27-29)
  • Mac M芯片上安装统信UOS 1070arm64虚拟机
  • React实现虚拟列表的优秀库介绍
  • pyecharts可视化数据大屏【详细教程】
  • Flutter之SystemChrome全局设置
  • hpl 的测试配置文件 HPL.dat 的内容说明
  • Eclipse WEB项目在IDEA中使用
  • 《系统安全架构设计及其应用》写作框架,软考高级系统架构设计师
  • RabbitMQ练习(AMQP 0-9-1 Overview)
  • github actions CICD简单使用案例
  • uniapp 各个端接入腾讯滑动行为验证码示例
  • 毕业论文word页眉页脚和页码的问题
  • 【笔记】自动驾驶预测与决策规划_Part1_自动驾驶决策规划简介