joseph的大m问题

   

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;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值