k: 第k人
Time Limit: 1 Sec Memory Limit: 128 MBDescription
TT在跟朋友一起做游戏,
游戏规则:n个小朋友(从1开始编号)手拉手,从第一个小朋友开始报数,喊出k的小朋友从圈中出去,然后下个小朋友从1开始报数。
当圈中只剩下一个小朋友的时候结束。TT想知道谁会胜出。
Input
T(T组,T<=10)
T行,每行两个个数字n,k代表当前有n个小朋友(n<=1000)k如上述(k<=1e5)
Output
对每组输出胜出者的编号
Sample Input
1 5 2
Sample Output
3
HINT
第一个出去的是2号:1 3 4 5
第二个出去的是4号,1 3 5
第三个出去的是1号,3 5
第四个出去的是5号,3
3胜出
直接O(n^2)暴力即可,注意k比较大每次对剩余人数取余。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 bool bo[1005]; 5 int main(){ 6 int T,n,k; 7 scanf("%d",&T); 8 while(T--){ 9 memset(bo,0,sizeof bo); 10 scanf("%d%d",&n,&k); 11 k--; 12 int now=1; 13 for(int i=n;i>1;i--){ 14 int t=k%i,cnt=0; 15 while(cnt<t){ 16 now=now%n+1; 17 if(!bo[now])cnt++; 18 } 19 bo[now]=1; 20 while(bo[now])now=now%n+1;//找到下一个起点 21 } 22 printf("%d ",now); 23 } 24 return 0; 25 }