题目:约瑟夫环,有一个环先删掉第一个元素,然后每隔m个数字删掉,问最后剩下的是2号元素,
则应该去的最小m为多少。
分析:数论,模拟。将元素编号0~n-1,最后剩下编号的递推关系:f(n,m)=(f(n-1,m)+m)%n。
因此,问题转化成n-1元素,剩下第一个元素的约瑟夫环,按循序枚举m找到第一个成立的即可。
说明:╮(╯▽╰)╭。
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int deal(int n, int m) { int s = 0; for (int i = 2; i < n; ++ i) s = (s+m)%i; return s; } int main() { int n; while(cin >> n && n) { for (int i = 1; ; ++ i) { if (!deal(n, i)) { cout << i << endl; break; } } } return 0; }
时间: 2024-10-09 11:14:08