做法正确
只A了4个点,其他所有测试点显示 ax<ay
不知道是哪里错
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
const int N=1e5+86;
int t,n,cnt,op[N<<1][2],tot;
ll a[N],sum;
template<typename T>
inline void read(T &x)
{
T k=1;char ch=getchar();x=0;
while(ch<'0'||ch>'9'){if(ch=='-') k=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=k;
}
int main()
{
read(t);
while(t--)
{
read(n);
cnt=sum=tot=0;
for(int i=1;i<=n;i++)
read(a[i]),sum+=a[i];
while((sum&1)==0) sum>>=1;
bool f=false;
for(int i=1;i<=n;i++)
{
if(a[i]==0) continue;
if(a[i]%sum)
{
printf("NO\n");
f=true;
break;
}
a[i]/=sum;
cnt++;
}
if(f) continue;
printf("YES\n");
while(cnt!=1)
{
for(int i=1;i<=n;i++)
{
if(a[i]==0) continue;
if((a[i]&1)==1)
{
int j=i+1;
while((a[j]&1)==0) j++;
if(a[i]<a[j])
{
op[++tot][0]=j;
op[tot][1]=i;
a[j]-=a[i];
if(a[j]==0) cnt--;
a[i]<<=1;
}
else
{
op[++tot][0]=i;
op[tot][1]=j;
a[i]-=a[j];
if(a[i]==0) cnt--;
a[j]<<=1;
}
i=j;
}
}
for(int i=1;i<=n;i++)
if(a[i]) a[i]>>=1;
}
printf("%d\n",tot);
for(int i=1;i<=tot;i++)
printf("%d %d\n",op[i][0],op[i][1]);
}
return 0;
}