卧薪尝胆,厚积薄发。
约瑟夫环 V2
Date: Sat Aug 25 20:55:40 CST 2018 In Category: NoCategory

Description:

$N$ 个人坐成一个圆环(编号为 $1$ ~ $N$ ),从第 $1$ 个人开始报数,数到 $K$ 的人出列,后面的人重新从 $1$ 开始报数。问最后剩下的人的编号。
$2\le n \le 10^{18},1\le k \le 1000$

Solution:

约瑟夫问题有递推式 $f[i]=(f[i-1]+k)\%i$ (用 $0$ ~ $n-1$ 标号),发现 $k$ 很小,于是可以多次计算再取模, $f[i-1]+w\times k\le i$ ,于是一次计算 $w$ 次。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
long long n,k;
int main()
{
long long f = 0;
cin >> n >> k;
for(long long i = 1;i <= n;)
{
long long x = (i - f) / k + 1;
if(i + x > n)x = n - i;
if(x == 0)break;
f = (f + k * x) % (i + x);
i += x;
}
cout << f + 1 << endl;
return 0;
}
In tag: 玄学
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡