基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3
地址:http://www.51nod.com/Challenge/Problem.html#!#problemId=1073
思路: 约瑟夫环的数学推导公式 f(n)=(f(n-1)+m)%n 编号从0->n-1
大佬博客:https://blog.csdn.net/u011500062/article/details/72855826
大致讲一下映射, 对于 n=7,数到m=3出列。
0 1 2 3 4 5 6 第一次 2出列 变为
0 1 3 4 5 6 又从3开始,可映射为
4 5 0 1 2 3 此时可看成 n=6,m=3,从第三个开始编号0,
若已求出 答案 f(6)=1,映射到n=7即 f(7)=4;
因为 f(6)的状态是由 f(7)转换而来,那么f(7)=(f(6)+m)%7;
这是由于 n=7
0 1 2 3 4 5 6 第一次 2出列后 又从3开始重新编号及
4 5 X 0 1 2 3 0前面有m个数,因此 4映射到1为 4= (1+m)%7; 即 f(7)=(f(6)+m)%7;
因此可推出 f(n)=(f(n-1)+m)%n;
而题目编号由 1开始,因此 ans=f(n)+1;
Code:
#include<iostream>
using namespace std;
int main()
{
int n,m,t;
while(cin>>n>>m){
t=0;
for(int i=1;i<=n;++i)
t=(t+m)%i;
cout<<t+1<<endl;
}
return 0
}