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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮