有n个同学围成一圈,其id依次为1,2,3...n(n号挨着1号)。现在从1号开始报数,第一回合报到m的人就出局,第二回合从出局的下一个开始报数,报到m^2的同学出局。
以此类推直到最后一个回合报到m^(n-1)的人出局,直到剩下最后一个同学。输出这个同学的编号。n<=15,m<=5
每一行第一个数字代表n,第二个数字代表m
输出最后剩下同学的编号
5 2
5
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if (n<1 || m<1) return -1;
int circle=pow(m,n-1);
int f=0;
for(int i=2;i<=n;++i)
{
f=(f+circle)%i;
circle/=m; // 调整为当前的 m,因为 m 有做关于 n 的次方
}
cout<<f+1<<endl;
return 0;
} <?php
fscanf(STDIN, "%d %d", $n, $m);
$num=array();
$num[0]=0;
for ($i=1;$i<=$n;++$i) $num[$i]=$i;
$i--;
$j=1;
$pre=0;
while ($i>1){
$j*=$m;
$outid***re)%$i;
if ($outidx==0) $outidx=$i;
$pre=$outidx-1;
//echo $num[$outidx]."\n";
unset($num[$outidx]);
$num=array_values($num);
//var_dump($num);
$i--;
}
echo $num[1];
?>