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的情况
}
}
标签:Task,int,个数,cin,Sakurako,空缺
From: https://www.cnblogs.com/yxcblogs/p/18395911