题意
先给你两个数:
a
,
b
a,b
a,b
a
a
a代表的是一共有
a
a
a组询问,
b
b
b代表的是可以对这个数进行多次加减
b
b
b的操作。
下面有
a
a
a行,分别代表每组询问,请输出每组询问过后的没有被询问的最小的正整数。
思路
这个题相对来说思路比较复杂,但是代码量十分友好。
给一个指针
d
d
d,每组询问的
c
c
c,让
s
t
[
c
st[c
st[c%
b
]
+
+
b]++
b]++(让
c
c
c显出原形,这样代表目前和c模b同余的数中,我已经询问过
c
+
c
∗
(
s
t
[
c
c+c*(st[c
c+c∗(st[c%
b
]
−
1
)
b]-1)
b]−1)这个数了)
如果
s
t
[
d
st[d
st[d%
b
]
>
d
/
b
b]>d/b
b]>d/b也就是说,如果我当前d所在的这个位置,在之前已经被询问过了。那么我让
d
+
+
d++
d++(因为取模运算的特性,会一直循环的)
#include<iostream>
using namespace std;
int st[2102100];
int main(){
int a,b,c,d=0;
cin>>a>>b;
for(int i=1;i<=a;i++){
cin>>c;
st[c%b]++;
while(st[d%b]>d/b)d++;
cout<<d<<endl;
}
}