Educational Codeforces Round 98 (Rated for Div. 2) B
Educational Codeforces Round 98 (Rated for Div. 2) B
大意
给定 \(n\) 个数,现在需要增加某一些数的值,以满足如下条件:
任意拿出一个数,将它的值分给另外 \(n-1\) 个数,至少存在一种分法,让剩下的 \(n-1\) 个数相等。
问:
最少需要增加的值是多少?
思路
40min AC ...
记原来 \(n\) 个数之和为 \(sum\) ,增加的值为 \(dx\) 。\((sum+dx)\) 应该满足条件。
显然, \((n-1)\mid (sum+dx)\)
记 $K =\dfrac{sum+dx}{n-1} $ ,则 \(K\) 的含义就是相等时的值。
记 \(n\) 个数中最大值为 \(X\) 。
不难发现当且仅当 \(X \leq K\) 时,一定满足 \(n-1\) 个数相等的条件。
现在我们最小化 \(K\) 的值。
移项得 \((n-1)X-sum\leq dx\)
我们得到如下条件:
\(\begin{cases}(n-1)*X-sum\leq dx\\ (n-1)\mid (sum+dx)\end{cases}\)
当 \(sum \leq (n-1)*X\) 时, \(dx_{min}=(n-1)*X-sum\)
当 \((n-1)|sum\) 时, \(dx_{min}=0\)
否则 \(dx_{min}=(n-1)-(sum\%(n-1))\) ,此时 \((n-1)|(sum+dx_{min})\)
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int t;
ll n;
ll a[100100];
ll gcd(cint x, cint y) {
return y==0? x: gcd(y, x%y);
}
int main() {
cin >> t;
while(t--) {
ll mx=0;
ll sum=0;
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i];
sum += a[i];
mx = max(mx, a[i]);
}
if(sum <= mx*(n-1)) cout << mx*(n-1)-sum << endl;
else if(!(sum%(n-1))) cout << 0 << endl;
else cout << (n-1) - (sum%(n-1)) << endl;
}
return 0;
}
我之前写的思路是什么鬼玩意...