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-sumleq dx)
我们得到如下条件:
(egin{cases}(n-1)*X-sumleq 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;
}
我之前写的思路是什么鬼玩意...