D. Zero Remainder Array

time limit per test

2 seconds

memory limit per test

256 megabytes

You are given an array a consisting of n positive integers.

Initially, you have an integer x=0. During one move, you can do one of the following two operations:

  1. Choose exactly one i from 1 to n and increase ai by x (ai:=ai+x), then increase x by 1 (x:=x+1).
  2. Just increase x by 1 (x:=x+1).

The first operation can be applied no more than once to each i from 1 to n.

Your task is to find the minimum number of moves required to obtain such an array that each its element is divisible by k (the value k is given).

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1≤t≤2⋅104) --- the number of test cases. Then t test cases follow.

The first line of the test case contains two integers n and k (1≤n≤2⋅105;1≤k≤109) --- the length of a and the required divisior. The second line of the test case contains n integers a1,a2,...,an (1≤ai≤109), where ai is the i-th element of a.

It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).

Output

For each test case, print the answer --- the minimum number of moves required to obtain such an array that each its element is divisible by k.

Example

Input

Copy

复制代码
5
4 3
1 2 1 3
10 6
8 7 1 8 3 7 5 10 8 9
5 10
20 100 50 20 100500
10 25
24 24 24 24 24 24 24 24 24 24
8 8
1 2 3 4 5 6 7 8

Output

Copy

复制代码
6
18
0
227
8

Note

Consider the first test case of the example:

  1. x=0, a=1,2,1,3. Just increase x;
  2. x=1, a=1,2,1,3. Add x to the second element and increase x;
  3. x=2, a=1,3,1,3. Add x to the third element and increase x;
  4. x=3, a=1,3,3,3. Add x to the fourth element and increase x;
  5. x=4, a=1,3,3,6. Just increase x;
  6. x=5, a=1,3,3,6. Add x to the first element and increase x;
  7. x=6, a=6,3,3,6. We obtained the required array.

Note that you can't add x to the same element more than once.

解题说明:此题是一道数学题,因为每个元素只能被加一次,我们对每个元素%k,然后记录他们出现的次数(不考虑k能整除的情况),因为x是递增的,所以如果我们将取余后的数看成一个数组的话,就相当于x在这个数组上跑循环,直到循环次数等于数组中最大的那个数为止。

cpp 复制代码
#include<iostream>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
int main() 
{
    ll t, n, k, a, ans; 
    cin >> t;
    while (t--) 
    {
        cin >> n >> k; 
        map<ll, ll>mp; 
        ans = -1;
        for (int i = 0; i < n; i++)
        {
            cin >> a;
            if (a % k) 
            { 
                ans = max(ans, (k - a % k) + k * mp[k - a % k]++); 
            }
        }
        cout << ans + 1 << endl;
    }
    return 0;
}
相关推荐
Navigator_Z9 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
Escalating_xu11 小时前
【C语言数据类型和变量·上】从内置类型到变量模型:一次讲透 sizeof、signed/unsigned 与作用域
c语言
aramae11 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
多弗朗皮卡丘14 小时前
数据结构9:排序算法
c语言·数据结构·排序算法
老当益壮梁奶奶17 小时前
ARM 汇编学习笔记(二)启动代码、指令、函数调用与 C 混合编程
c语言·arm开发·单片机·嵌入式硬件·51单片机
wuminyu19 小时前
Markword在紧凑对象头上的实现原理剖析
java·linux·c语言·jvm·c++
潘潘的嵌入式日记19 小时前
位操作怎么写才不出错?置位、清位、翻转、取位一次讲清
c语言·嵌入式·寄存器·位操作
无忧.芙桃20 小时前
数据结构之排序算法(上):从评价指标到插入、希尔、选择与堆排序
c语言·c++·排序算法
SuperByteMaster20 小时前
configUSE_TIME_SLICING和configUSE_PREEMPTION
c语言
周杰偷奶茶20 小时前
【C 语言】分支、循环和 goto 语句(附实战)
c语言