【题目描述】
现有n个人按照编号1~n的顺序顺时针围成一圈,从1号开始顺时针报数,报到t的人退出圈子,然后从他的下一位开始接着报数,询问最后一个退出圈子的人在哪个位置。
【输入描述】
输入两个数n、t。
【输出描述】
输出一个数,表示答案。
【输入样例】
3 2
【输出样例】
3
【数据范围及提示】
对于30%的数据,n <= 100;
对于100%的数据,n <= 100000,1 <= t <= 100。
源代码: #include<cstdio> struct Node { int To,From; }i[100001]; int N,T,Num=0,Ans=1; int main() //暴力模拟也值得学习。 { scanf("%d%d",&N,&T); i[1].To=2; //注意首尾。 i[1].From=N; i[N].To=1; i[N].From=N-1; for (int a=2;a<N;a++) //建环。 { i[a].To=a+1; i[a].From=a-1; } while (i[Ans].From!=Ans&&i[Ans].To!=Ans) //还没只剩一个人。 { Num++; if (Num==T) //去掉节点。 { Num=0; i[i[Ans].To].From=i[Ans].From; i[i[Ans].From].To=i[Ans].To; } Ans=i[Ans].To; } printf("%d",Ans); return 0; }