这是一道数学题
首先,我们可以发现只要求出任意一种方案即可。
于是我们通过模拟样例得出,有一种保证只要 3 ∗ ( n − 1 ) 3*(n-1) 3∗(n−1) 步求可以得出答案:
- 先让 a [ i ] a[i] a[i] 能被 i i i 整除。
- 把 a [ i ] a[i] a[i] 转移到 a [ 1 ] a[1] a[1] 上。
- 再把 a [ 1 ] a[1] a[1] 分成 n n n 组
注意:当 $ \sum_{}a[i]$ 不能被 n n n 整除时,应该直接输出 − 1 -1 −1。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,t,sum,b[10005],a[10005];
int main(){
scanf("%d",&t);
while(t--){
sum=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),sum+=a[i],b[i]=a[i]%i;
if(sum%n!=0){
printf("-1\n");
continue;
}
printf("%d\n",3*(n-1));
for(int i=2;i<=n;i++){
printf("1 %d %d\n",i,(i-b[i])%i);
if(a[i]%i!=0){
a[1]=a[1]-((i-b[i])%i);
a[i]=a[i]+((i-b[i])%i);
}
printf("%d 1 %d\n",i,a[i]/i);
a[1]=a[1]+a[i];
a[i]=0;
}
for(int i=2;i<=n;i++){
printf("1 %d %d\n",i,sum/n);
a[1]-=sum/n;
a[i]=sum/n;
}
}
return 0;
}