cf1417-D. Make Them Equal
cf1417-D. Make Them Equal
You are given an array a consisting of n positive integers, numbered from 1 to n. You can perform the following operation no more than 3n times:
choose three integers i, j and x (1≤i,j≤n; 0≤x≤109);
assign ai:=ai−x⋅i, aj:=aj+x⋅i.
After each operation, all elements of the array should be non-negative.
Can you find a sequence of no more than 3n operations after which all elements of the array are equal?
Input
The first line contains one integer t (1≤t≤104) — the number of test cases. Then t test cases follow.
The first line of each test case contains one integer n (1≤n≤104) — the number of elements in the array. The second line contains n integers a1,a2,…,an (1≤ai≤105) — the elements of the array.
It is guaranteed that the sum of n over all test cases does not exceed 104.
Output
For each test case print the answer to it as follows:
if there is no suitable sequence of operations, print −1;
otherwise, print one integer k (0≤k≤3n) — the number of operations in the sequence. Then print k lines, the m-th of which should contain three integers i, j and x (1≤i,j≤n; 0≤x≤109) for the m-th operation.
If there are multiple suitable sequences of operations, print any of them. Note that you don’t have to minimize k.
Example
Input
3
4
2 16 4 18
6
1 2 3 4 5 6
5
11 19 1 1 3
Output
2
4 1 2
2 3 3
-1
4
1 2 4
2 4 5
2 3 3
4 5 1
思路:把所有的數都加到第一個數上,如果那個數不能整除i就用第一個數把那個數補齊然後在加到第一個數上,務必要把所有的數加乾淨,然後在從第一個數分配到其他位置就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n;
int a[100007];
int ii[30007],jj[30007],xx[30007];
int ee[30007];
int main()
{
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum%n!=0)
{
printf("-1\n");
}else
{
if(n==1)
{
printf("0\n");
}else
{
int cnt=0,cc=0;
int x=sum/n;
int flag=0;
for(int i=2;i<=n;i++)
{
if(a[i]%i==0)
{
ii[++cnt]=i;
jj[cnt]=1;
xx[cnt]=a[i]/i;
a[i]-=i*xx[cnt];
a[1]+=i*xx[cnt];
}else
{
ii[++cnt]=1;
jj[cnt]=i;
xx[cnt]=i-a[i]%i;
a[1]-=i-a[i]%i;
a[i]+=i-a[i]%i;
ii[++cnt]=i;
jj[cnt]=1;
xx[cnt]=a[i]/i;
a[i]-=i*xx[cnt];
a[1]+=i*xx[cnt];
}
}
for(int i=2;i<=n;i++)
{
if(a[i]!=x)
{
ii[++cnt]=1;
jj[cnt]=i;
xx[cnt]=x-a[i];
a[1]-=x-a[i];
a[i]=x;
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%d %d %d\n",ii[i],jj[i],xx[i]);
}
}
}
}
return 0;
}```
相關文章
- CF.1416B. Make Them Equal
- I basically see it as them attempting to make a new minigameGAM
- [LeetCode] 3226. Number of Bit Changes to Make Two Integers EqualLeetCode
- Ruby Struct EqualStruct
- Rust Reference Cycles: Resolving and Avoiding themRust
- B. Equal XOR
- ./configure,make,make install的作用
- 【Lintcode】1322. Product Equal B
- Make It Zero
- Make 使用
- [ABC227H] Eat Them All 題解
- [LeetCode] 2831. Find the Longest Equal SubarrayLeetCode
- [LeetCode] 416. Partition Equal Subset SumLeetCode
- make與cmake
- cmake和make
- from cmake make
- Linguistics-English-Would, Should, and Could: How to Use Them CorrectlyNGUI
- [LeetCode] 2491. Divide Players Into Teams of Equal SkillLeetCodeIDE
- 【Leetcode】453. Minimum Moves to Equal Array ElementsLeetCode
- Python實現make_bricks與make_chocolate問題Python
- std::make_shared
- Go make 介紹Go
- B - Make Many Triangles
- caffe make 編譯編譯
- Make sure to include VueLoaderPluginVuePlugin
- [leetcode] 1624. Largest Substring Between Two Equal CharactersLeetCode
- [Vue] One Object to Rule Them All (v-bind & v-on syntax)VueObject
- android make 沒反應Android
- C中make不過
- LIFE2020-make-more
- make:migration 的騷操作
- How to make sense of Kotlin coroutinesKotlin
- 控制make的函式函式
- 求助 :ubuntu 編譯核心後(make -jn),sudo make modules_install報錯Ubuntu編譯
- Three Locks To Rule Them All(三把鎖統治一切)
- Go 語言 -make函式Go函式
- 使用make命令建立Service類
- C語言 Make命令教程C語言