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;
}
相关推荐
上海安当技术8 小时前
C/S 桌面软件怎么接 UKey 强认证?C# SDK 与 C 动态库集成 WinForms/Qt/工控实战
c语言·qt·c#
(Charon)9 小时前
【C++】锁与原子操作(四):自旋锁的完整实现与性能优化
c语言·开发语言·c++
小羊先生car11 小时前
RTOS-F429-HAL-Freertos内存管理(2026/8/5)
c语言·单片机·rtos
呜喵王阿尔萨斯11 小时前
extern “C“ in C++
c语言·c++·算法
萌新源14 小时前
电赛C题:我用星闪+UWB做了一个数字钥匙门锁系统,开源了
c语言·华为·开源
不正经学生15 小时前
C语言指针进阶:const 和野指针——给指针加锁,向野指针宣战
c语言·开发语言·c++·算法·c#
多弗朗皮卡丘17 小时前
C语言梦开始的地方3
c语言·开发语言
天空'之城1 天前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
stevenseahang1 天前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·可移植性·标准演化·ansic
别动我齐刘海1 天前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github