众所周知,约瑟夫问题是一个经典的问题,这道题便是它,只不过数据更大。
题目描述:
有n只hw排在一圈,编号为1-n。现在从1开始报数,报到m时,报m的hw就出去,然后继续。最后圈只剩下一个hw,输出他的编号。
Input:
一行包括两个整数n,m。
Output:
最后一只hw的编号。
Sample Input:
5 3
Sanple Output:
4
数据范围:
80%:n<=10^7,m<=10^9
另外20%:n<=10^9,m=2
思路:
因为题目中数据太大,所以说一定可以找出特定的规律,于是博主便用机智而灵敏的大脑想出了
对于所有数据:
for (int i = 2; i <= n; i++)
{
int g = f;
f = (g + m) % i;
}
对于m=2:
if (m == 2)
{
int t = 1;
while ((t << 1) <= n) t <<= 1;
cout>>((n - t) * 2 + 1);
return;
}
以下是全部代码:
#include<bits/stdc++.h>//万能头文件,包含所有,平时可以用,NOIP不允许
using namespace std;
int n,m;
int main()
{
cin >> n >> m;
if (m == 2)
{
int t = 1;
while ((t << 1) <= n) t <<= 1;
cout << (n - t) * 2 + 1;
return 0;
}
int f = 0;
for (int i = 2; i <= n; i++)
{
int g = f;
f = (g + m) % i;
}
cout << f+1;
return 0;
}