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;
}
posted @ 2022-12-16 22:09  Szang  阅读(23)  评论(0编辑  收藏  举报