有m个猴子围成一圈,按顺时针编号,分别为1到m。现打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始顺时针报数,报到n的猴子出圈,紧接着从下一个又从1顺时针循环报数,...,如此下去,最后剩下来的就是大王。
Input
第一行是一个正整数T表示测试数据的组数。下面共有T行,每行两个整数m和n,用一个空格隔开,分别表示猴子的个数和报数n。1<=m<=100,1<=n<=200。
Output
每组数据对应有一个输出,表示大王的编号。
Sample Input
1
3 2
Sample Output
3
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct node{
int x;
struct node *next;
}node;
node *head=NULL;
int main(){
int m,n,t;
node *s,*k;
cin>>t;
while(t--){
int jishu=0;
cin>>m>>n;
head=(struct node*)malloc(sizeof(struct node));
head->next=NULL;
head->x=1;
node *p=head;
for(int i=2;i<=m;i++){
node *q=(struct node*)malloc(sizeof(struct node));
q->x=i;
q->next=NULL;
p->next=q;
p=q;
}
p->next=head;
node *t;
while(1){
jishu++;
t=p;
if(p==p->next){ //说明只剩下一个猴子了
printf("%d\n",p->x);
break;
}
p=p->next;
if(jishu%n==0){
t->next=p->next;
free(p);
p=t;
}
}
free(p);
}
return 0;
}