https://www.luogu.com.cn/problem/CF1416B
显然如果总和不是n的倍数,那么必然无解
考虑先把所有的数都移到1,然后再分配回去
如果当前这堆不能整除
i
i
i,那么可以先从1借一些过来(因为保证了
a
i
>
=
1
a_i>=1
ai>=1,所以按顺序做的话是一定可以借到的)
那么代码就很简单了
code:
#include<bits/stdc++.h>
#define N 200050
using namespace std;
int a[N], n, t;
void solve() {
scanf("%d", &n);
int s = 0;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), s += a[i];
if(s % n) {
printf("-1\n");
return ;
}
printf("%d\n", 3 * (n - 1));
for(int i = 2; i <= n; i ++) {
int r = a[i] % i;
printf("%d %d %d\n", 1, i, (i - r) % i);
a[i] += (i - r) % i;
printf("%d %d %d\n", i, 1, a[i] / i);
}
for(int i = 2; i <= n; i ++) printf("%d %d %d\n", 1, i, s / n);
}
int main() {
scanf("%d", &t);
while(t --) solve();
return 0;
}