Description
设有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,输出最后一个的编号。
Input
n,m (1<=n,m<=100000)
Output
最后一个的编号
Sample Input
13 5
Sample Output
6
解题思路:在读入后,先建立一个1..n的循环链表,然后由一开始扫描,当i累计到mod m=0的时候就将last的指针指向next的下一个元素,并将next所指的地址删除,当next的下一个元素是next本社结束循环,最后输出即可。
程序:
type
point=^node;
node=record
data:longint;
link:point;
end;
var
m,n,i1:longint;
i:int64;
head,next,last:point;
begin
readln(n,m);
new(head);
head^.data:=1;
last:=head;
for i1:=2 to n do
begin
new(next);
next^.data:=i1;
last^.link:=next;
last:=next;
end;
last^.link:=head;
i:=1;
next:=head;
repeat
if i mod m=0 then
begin
last^.link:=next^.link;
dispose(next);
next:=last;
end else last:=next;
next:=next^.link;
inc(i);
until next^.link=next;
writeln(next^.data);
end.