题意:
题目保证所有数据,n的总和<=1e4。
解法:
发现操作不会改变数据的总和,因此先统计序列的总和sum,如果sum%n!=0,那么无解.
否则令ave=sum/n.
对于[2,n],考虑先将a[i]变成i的倍数,然后将a[i]全部丢给a[1],只需要2*(n-1)次操作,
考虑是否能将a[i]变成i的倍数:
由于题目保证初始情况下,a[i]>=1,因此a[1,i-1]的和>=i-1,
当a[i]%i!=0时候,只需要加上i-(a[i]%i)即可,而i-(a[i]%i)<=i-1,
因此一定能将a[i]变为i的倍数.
现在a[1]=sum,a[2,n]=0,
我们只需要依次将[2,n]全部变成ave即可,进行(n-1)次操作即可,
总共3*(n-1)次操作.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=1e4+5;
struct Node{
int i,j,x;
};
vector<Node>ans;
int a[maxm];
int n;
void solve(){
ans.clear();
//
cin>>n;
int sum1=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum1+=a[i];
}
if(sum1%n){
cout<<-1<<endl;
return ;
}
int ave=sum1/n;
for(int i=2;i<=n;i++){
int t=a[i]%i;
if(t)t=i-t;
ans.push_back({1,i,t});
a[i]+=t;
a[1]-=t;
ans.push_back({i,1,a[i]/i});
a[1]+=a[i];
a[i]=0;
}
for(int i=2;i<=n;i++){
ans.push_back({1,i,ave});
a[i]+=ave;
a[1]-=ave;
}
cout<<ans.size()<<endl;
for(auto i:ans){
cout<<i.i<<' '<<i.j<<' '<<i.x<<endl;
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;cin>>T;
while(T--){
solve();
}
return 0;
}