G. Sakurako's Task

https://codeforces.com/contest/2008/problem/G

总结:一开始思路错了,考虑的只有n = 1和g = 1,还有其他情况。其实情况应该分为其他三种:n = 1,n个数之间的所有空缺都能被填完(并且k仍剩余可以继续往后填),n个数之间的空缺不能被填完三种情况。

inline void solve(){
	int n, k;
	cin >> n >> k;

	vector<int> a(n);
	int g = 0;
	for (auto& x : a) {
		cin >> x;
		g = ::gcd(x, g);
	}

	if (n == 1) {
		cout << (k <= g ? k - 1 : k) << '\n';       //如果只有一个数,特殊处理
	}
	else if (1ll * (g - 1) * (n - 1) <= k - 1) {    //为什么是k-1?因为留出一个数来从n开始计数,保证一定可以填满所有空缺后,仍然有多余的数
		cout << (n + k - 1) << '\n';        //如果所有circle都能被填上(1 ~ g-1, g + 1 ~ 2 * g - 1...)
	}
	else {
		cout << (k - 1) / (g - 1) * g + (k - 1) % (g - 1) + 1 << '\n';
		//这里为什么这么写呢?假如有序列0, 3, 6, 9..,那么g = 3, g - 1 = 2,k = 4
		//如果直接k / 2 = 2,那么起点就是6了,(k - 1) / 2是为了保证,一定从填充结束的前一块开始作为起点
		//而后面的(k - 1) % 2 + 1纯粹是为了避免k最后的填充位置是最后一位,导致取模为0的情况
	}

}
posted @ 2024-09-04 10:05  _Yxc  阅读(37)  评论(0编辑  收藏  举报