​题目地址​

题意

给你一个空数组,你可以q次操作查询,每一次操作将一个数放入数组中。并输出数组中没有的最小数。同时有一个x,数组中的任意元素都可以对 + - x 进行任意次操作。

思路:

因为是对x任意次数操作,所以可以想到要是否存在一个数target 这个数 可以通过 数组中的一个数进行对x的几次操作而得来。那么 target % x 这个数 在数组中一定是存在的。 所以我们可以储存每次插入数对x的余数,这个余数对x 操作可以配凑成一些数。现在只要统计余数的个数即可。如果当前的
target 在数组中是没有数 可以 配凑而来的即 a[ 数组中的数 % x] = 0,那么输出这个数即可。

代码

#include<cstdio>
using namespace std;
int a[400005];
int main()
{
int n, x;
scanf("%d %d", &n, &x);
int t = 0;
while(n--)
{
int m;
scanf("%d", &m);
a[m % x]++;

while(a[t % x])
{
a[t % x]--;///此前的余数构成的数已经出现。
t++;
}
printf("%d\n", t);
}
return 0;
}