1006: Joseph的大M问题
经典的Joseph问题。有n个人围成一个圈,从1到n编号。从1号开始报数,报到m的出列,然后接着从1开始报数。求最后剩下的那个人的编号。
第一行为一个正整数,表示有多少组测试数据。每组测试数据有两个数n和m。(n<10^4,m<10^9)
每组数据对应一行输出,代表最终留下的那个人的编号。
这道题做的有点侥幸,前段时间想过这道题,但没想出来,总想找个规律,当初的解题思路是1---因为只留一个数,所以就得扔掉n-1个数,所以再用(n-1)*m这样就可以求出要自己补多少个数了,再找是m的倍数,后想了很久来发现这个方法根本行不通,,所以就放弃了;
2--今天继续做题,又看到这道题,所以就打算开始再重新做遍,想了很久没思路,于是百度,求这种题的思路;结果真找到了,,但是找到了又怎样,想不明白不照样没用;只怪自己太笨;一直看这个思路看了四五个小时才看明白一点;原来就是找规律;数学题;3-----------解题报告,先正推;有1--n个整数;规定数到m则扔掉;则下一个编号为m/n;然后下一个再编号为1,2,3,。。。。;然后在用m/n-1;就这样重复着到。。m/2;就得出最后编号x,再反推;就可以得出原始x的编号;----------------------------------------现在想想,总结:这道题的关键是正反推方式;题和思想很漂亮。不要忘了。
#include<stdio.h>
int
main()
{
int
a,b,c,d,i,j;
scanf
(
"%d"
,&a);
for
(b=1;b<=a;b++)
{
scanf
(
"%d%d"
,&c,&d);
j=0;
for
(i=2;i<=c;i++)
{
j=(d+j)%i;
}
printf
(
"%d\n"
,j+1);
}
return
0;
}