约瑟夫环问题

f(n)表示有n个人,最后一个出局的人的编号
则f(n-1)表示有n-1个人,最后一个出局的人的编号

首先这一个大圆圈,我们从0开始给他们编号,然后开始从1报数,报数到K则出局
那么第一个出局的人,他的下标编号就是K-1

有一个出局的人之后,从他的下一个开始重新给他们编号,那么就是n-1个人,刚才编号是K的现在更新他的编号是0


灵魂画师.png

0 -- 1 -- 2 -- 3 (f[n-1],即更新后最后一个出局的人的下标编号)
k -- k+1 -- k+2 -- k+3 (最后出局的人原本的的下标编号)

那么我们就找到了 f(n-1) 和 f(n) 的一个对应关系
f(n) = (f(n-1) + k) % n

代码实现如下:


using namespace std;

const int N = 1000010;
int n, k;
int f[N];

int main()
{
    f[1] = 0;
    cin >> n >> k;
    for(int i = 2; i <= n ; i++)    f[i] = (f[i-1] + k) % i;
    
    cout << f[n] + 1 << endl;
}
全部评论

相关推荐

字节 飞书绩效团队 (n+2) * 15 + 1k * 12 + 1w
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务