题目描述
给你N个站成一列的士兵和一个整数M,士兵编号是1 --- N。每次士兵按编号从小到大的顺序依次报数,如果报的数不是M的倍数,则该士兵出列。这样重复几次直到剩下的士兵的数量小于M为止。问最后剩下的士兵有几个,他们的编号分别是多少。
输入
每一行一组测试数据
m n
以0 0结束
输出
士兵剩下个数
编号
样例输入
1000000000 2
1000000000 3
1000000000 5
0 0
样例输出
1
536870912
2
387420489 774840978
4
244140625 488281250 732421875 976562500
数据范围太大,暴力绝对不行。注意到剩下的士兵编号一定是M的倍数,只不过士兵数量少于M。所以只要算出1到n中,有少于M个士兵编号是M的倍数即可!特殊数据还得处理一下QAQ
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
if(n==0&&m==0)
break;
int cnt=1,t=n;
if(n==0||m==0||m==1)
printf("0\n");
else
{
int b[m];
while(n>=m)
{
n/=m;
cnt*=m;
}
int j,k=0;
for(int i=1;;i++)
{
j=i*cnt;
if(j>t)
break;
else
{
b[k++]=j;
}
}
printf("%d\n",k);
for(int i=0;i<k;i++)
{
if(i!=k-1)
printf("%d ",b[i]);
else printf("%d\n",b[i]);
}
}
}
return 0;
}