题目链接:https://noi.vip/problem/1034
警队有N个人排成一队,从第1个人开始依次顺序报号一遍,凡报号为M和M的倍数者退出队伍。
如果一次报号中没有报号为M和M倍数者,则从第一个人接续报号,保证每次从队伍中退出一人。 然后再重新从第一个人开始依次报号一遍,重复上述过程,直到队伍中剩余最后一人。
找出最后一个留在队伍的警长的序号
输入样例:
5 3
输出样例:
2
求C++代码
题目链接:https://noi.vip/problem/1034
警队有N个人排成一队,从第1个人开始依次顺序报号一遍,凡报号为M和M的倍数者退出队伍。
如果一次报号中没有报号为M和M倍数者,则从第一个人接续报号,保证每次从队伍中退出一人。 然后再重新从第一个人开始依次报号一遍,重复上述过程,直到队伍中剩余最后一人。
找出最后一个留在队伍的警长的序号
输入样例:
5 3
输出样例:
2
求C++代码
意思是如果一次报号中有M或M的倍数,下一遍就不是第一个人接续报号了?
#include <iostream>
using namespace std;
#include <string.h>
int main()
{
int M,N,i;
cin>>N>>M;
int *out = new int[N];
memset(out,0,N*sizeof(int));
int count = 0,num = 0;
do
{
count = 0;
for(i=0;i<N;i++)
{
if(!out[i])
{
count++;
if(count % M == 0)
out[i] = 1;
}
}
}while(count >= M);
//
do
{
count = 0;
for(i=0;i<M-1;i++)
{
if(!out[i])
{
count++;
num++;
if(num%M==0)
{
out[i] = 1;
num = 0;
}
}
}
}while(count > 1);
//
for(i=0;i<N;i++)
if(!out[i])
{
cout<<i+1;
break;
}
return 0;
}