凌艺樽 • 5个月前
#include <iostream>
using namespace std;
int Choose_king(int n,int m)
{
int k=0;
for(int i=2;i<=n;i++)
{
k=(k+m)%i;//将胜利者的位置向前移m位,%i
}
return k+1;
}
int main()
{
int n,m;
//f(N,M)=(f(N-1,M)+M)%N
cin>>n>>m;
cout<<Choose_king(n,m);
return 0;
}
帅爆了,解释可以看这里:https://blog.csdn.net/u011500062/article/details/72855826
或者(精筛):
理解这个递推式的核心在于关注胜利者的下标位置是怎么变的。每杀掉一个人,其实就是把这个数组向前移动了M位。然后逆过来,就可以得到这个递推式:
f(N,M)=(f(N-1,M)+M)%N;
因为求出的结果是数组中的下标,最终的编号还要加1
评论: