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;
}
相关推荐
无相求码6 小时前
【C语言】字符串的本质是什么,为什么 strlen 会读到野内存
c语言·开发语言
LuminousCPP8 小时前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
SuperByteMaster8 小时前
__set_MSP 和__set_MSPLIM 接口区别
c语言
CS创新实验室10 小时前
NumPy数组的C风格和Fortran风格
c语言·开发语言·numpy
LuminousCPP11 小时前
单链表专题(应用篇):三道经典题吃透删除、反转与快慢指针
c语言·数据结构·笔记
薄情书生12 小时前
基于51单片机的电子钟设计(LCD12864显示 + DS1302)
c语言·51单片机·protues
半条-咸鱼12 小时前
【FreeRTOS】核心原理与实战速查手册
c语言·操作系统·rtos
白帽小阳13 小时前
Typora插件开发指南:打造专属IDE式写作环境
c语言·网络·python·网络安全·github·pygame·护网行动
ysu_03141 天前
06 | 200个单元测试C项目也能TDD
c语言·单元测试·tdd
烟锁池塘柳01 天前
【C/C++】解决C++控制台输出中文乱码问题
c语言·开发语言·c++