Zero Remainder Array
原题链接:传送门
题目大意
给你一个数组有n个正数,你想让这个数组都变成可以整除 k 的元素,你可以执行两种操作:
1.将ai + x ,然后 x ++
2.仅x++
一开始x = 0 ,求一共最少需要多少次操作可以使得满足上述条件,且输出最终的 x
分析
我们只需要记录下来每个数t距离k的模数就可以了:
即 k - (t % k) , 如果这个模数已经出现过那么我们需要再加上一个 k 来到下一个满足要求的最小位置即可。 由于数据范围很大我们可以利用map来进行保存取模后的距离。
AC 代码
AC code
void slove()
{
int n , k;cin >> n >> k;
map<ll,ll> m;
ll x = 0 , t = 0 , flag = 0;
for(int i = 0;i < n ;i ++)
{
cin >> t ;
if(t % k == 0)continue;
flag = 1;
int y = k - (t % k);
int val = m[y];
x = max(x ,(ll)val * k + y);
m[y]++;
}
if(flag)cout << x + 1 << endl;
else cout << 0 << endl;
}