#include int main() { long long T; //注意变量都要初始化 ,T为数组个数 scanf("%lld", &T); //数组个数,决定过程要执行多少次 for (int i = 0; i < T; i++) { long long n, m, bianhao, yushu, max = -1, index; //注意变量都要初始化,n为包裹个数,m为箱子个数,result是余数,max是装的最多 //以上变量必须定义在循环里,因为一组过后所有数据要重新开始!要不然max,index值未清除! scanf("%lld%lld", &n, &m); //键入包裹的个数和箱子的个数 long long Amount[m], number[n]; //Amount是定义对应的箱子里装几个 ,number是用数组记录包裹的“编号” //禁止写错数组个数! for (int j = 0; j < m; j++) //初始化箱子数组 ,注意数组是m个 { Amount[j] = 0; } for (int k = 0; k < n; k++) //把包裹赋值,记录到number里 注意数组是n个 { scanf("%lld", &bianhao); number[k] = bianhao; } for (int s = 0; s < n; s++) //进行mol m运算,余数计入number里 { yushu = number[s] % m; Amount[yushu] = Amount[yushu] + 1; } for (int t = 0; t < m; t++) //此循环计算哪个箱子装的最多 { //max=-1;错误 在循环里定义会导致max每走一个t都会被重置! if (max < Amount[t]) { max = Amount[t]; } } for (int u = 0; u < m; u++) //此循环寻找下标 { if (Amount[u] == max) { index = u; break; } } for (int v = 0; v < m; v++) //此循环输出amount数组里各个元素的大小 { printf("%lld ", Amount[v]); } printf("\n"); printf("%lld %lld", index, max); printf("\n"); } return 0; }