返回顶部

Codeforces Round #653 (Div. 3) D. Zero Remainder Array (数学,模拟)

  • 题意:有一组数,刚开始时\(x=0\),每次可以让\(x\)++或让某一个元素+=\(x\)\(x\)++,每个元素只能加一次\(x\),问最少操作多少次使得所有元素能被\(k\)整除.

  • 题解:每个元素只能被加一次,我们对每个元素%\(k\),然后记录他们出现的次数(不考虑\(k\)能整除的情况),因为\(x\)是递增的,所以如果我们将取余后的数看成一个数组的话,就相当于\(x\)在这个数组上跑循环,直到循环次数等于数组中最大的那个数为止(同时下标也要尽可能的大),所以答案也就是 (\(x\)\(0\)到满足条件的步数+(循环次数-1)*\(k\)).

  • 代码:

    int t;
    int n,k;
    ll x;
    map<ll,ll> mp;
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
        cin>>t;
         while(t--){
            cin>>n>>k;
            mp.clear();
            ll mx=0;
            ll num;
            for(int i=1;i<=n;++i){
                cin>>x;
                x%=k;
                if(x!=0){
                    mp[x]++;
                    if(mp[x]>mx){
                        mx=mp[x];
                        num=k-x;
                    }
                    else if(mp[x]==mx && k-x>num){
                        num=k-x;
                    }
                }
            }
            if(mx==0){
                cout<<0<<endl;
            }
            else{
                cout<<(mx-1)*k+num+1<<endl;
            }
         }
    
        return 0;
    }
    
    
posted @ 2020-06-29 13:23  Rayotaku  阅读(281)  评论(0编辑  收藏  举报