Codeforces Round 838 (Div. 2)
B. Make Array Good
题意:
给定n个数,每次可以对其中一个数进行操作 ,其中 ,在操作数量不超过n的前提下,构造一种操作使得任意两个数中,大的数可以被小的数整除。
分析:
结论:所有数共享了同一个底基,即被同一个数整除,那么要让这些数都能互相整除的条件是:他们是底基的倍数,倍数为2的整次幂。
以最小的数为底基,对于每一个数可以构造出相对应的倍数为2的整次幂的数。
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long ll;
pair<ll,int> a[N];
int main()
{
int op,n;cin>>op;
while(op--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].first;
a[i].second=i+1;
}
sort(a,a+n);
ll tar=a[0].first,cnt=0;
for(int i=0;i<n;i++)
{
while(a[i].first>tar) tar*=2;
a[i].first=tar-a[i].first;
if(a[i].first) cnt++;
}
cout<<cnt<<endl;
for(int i=0;i<n;i++)
{
if(a[i].first)
cout<<a[i].second<<' '<<a[i].first<<endl;
}
}
return 0;
}