题意:简单易懂
用线段树把数组存起来,而且存的是顺序,每次就看要拿现存数组的第几个然后拿就对了
比如说现在有8个,k为3
第一次拿第3个,剩7个,第二次拿第3+3=6个,剩6,第三次6+3=9 9%6=3,拿第三个,以此类推
线段树就能很好的解决这个问题
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
int X=0,w=1;
char ch=0;
while(ch<'0'&&ch>'9')
{
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
X=(X<<3)+(X<<1)+ch-'0';
ch=getchar();
}
return X;
}
const int N = 2e5+10;
struct node{
int l,r,sum;
}tree[4*N];
void build(int pos,int l,int r)
{
tree[pos].l = l;
tree[pos].r = r;
if(l == r)
{
tree[pos].sum = 1;
return ;
}
int mid = (l+r)>>1;
build(pos<<1,l,mid);
build(pos<<1|1,mid+1,r);
tree[pos].sum = tree[pos<<1].sum+tree[pos<<1|1].sum;
}
int update(int pos,int num)
{
tree[pos].sum--;
if(tree[pos].l==tree[pos].r)return tree[pos].l;
if(num<=tree[pos<<1].sum)
return update(pos<<1,num);
else
return update(pos<<1|1,num-tree[pos<<1].sum);
}
int main()
{
int n,m;
while(cin>>n>>m)
{
build(1,1,n);
cout<<m;
int now = m;
update(1,now);
for(int i=2;i<=n;i++)
{
now = (now+m-1)%tree[1].sum;
if(now == 0)now = tree[1].sum;
cout<<" "<<update(1,now);
}
cout<<endl;
}
return 0;
}