#include <iostream> #include <bits/stdc++.h> using namespace std; long long int f(long long int n,long long int m) { long long int num = 0,j; for(long long int i = 1; i < n;) { j = (i - num) / (m - 1); if((i - num) % (m - 1) != 0) j ++; if(i + j > n) j = n - i; num += j * m; i += j; num %= i; } return num+1; } int main() { long long int n,m; while(~scanf("%lld %lld",&n,&m)) { if(m == 1) printf("%lld\n",n); else printf("%lld\n",f(n,m)); } return 0; }
时间: 2024-04-21 18:28:27 浏览: 90
使用include <iostream>时一定要加using namespace std
这是一个解决洛谷P1963 约瑟夫问题(约瑟夫环)的代码,使用了数学方法来解决问题。
约瑟夫问题是一个经典的问题,据说是由弗拉维奥·约瑟夫斯(Flavius Josephus)提出的。问题描述如下:
有n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续报数,重复上述过程,直到剩下最后一个人。
解决约瑟夫问题的方法有很多,其中数学方法是比较高效的一种方法。具体来说,可以通过递推公式来求解问题,即:
f(n,m) = (f(n-1,m)+m) % n
其中f(n,m)表示n个人报数,每报到m时出圈的最后一个人的编号。递推公式的理解可以从这篇博客中找到:https://www.cnblogs.com/llhthinker/p/6817377.html
上面的代码实现了递推公式,并进行了一些优化,比如使用了取模运算和一些数学计算,使得程序更加高效。
阅读全文