题目描述
有N个士兵站成一行,从右到左,从1到N依次编号,他们还得到一个整数M。然后这些士兵从右手边的士兵开始报数。报的数为M的倍数的士兵留在队列里,其他的士兵需要离开队列。他们重复进行这项操作直到队列中的人数小于M。举例来说,如果有10个士兵,并且M=3。第一次操作后,编号为3,6,9的士兵留在队列中。第二次操作后,编号为9的士兵留在队列中。由于队列中的士兵的数量小于M,那么编号为9的士兵就是最终留在队列里面的士兵。
现在我们想知道哪些士兵将会最终留在队列中,你能告诉我们吗?
输入
输入包含几个测试数据。每个测试数据只占单独的一行,包含两个整数n和m(3 <= n <= 10^9, 2 <= m <= n)。当n=0 并且m=0的时候标志输入结束。
输出
对于每组测试数据,输出两行。第一行包含一个整数X,表示最终留下的士兵的数量。第二行包含X个整数,表示最终留下的士兵的编号。你应该把他们按照升序输出。
样例输入
10 3
8 3
0 0
样例输出
1
9
2
3 6
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
long long a[200000];
int main(){
long long n, m;
while (scanf("%lld%lld",&n,&m)!=EOF){
if (n == 0&&m ==0 )break;
long long k = m, t;
while (k <= n){
t = k;
k *= m;
}
int c = 0;
for (long long i = t; i <= n; i=i+t){
a[c++] = i;
}
cout << c << endl;
for (long long i = 0; i < c - 1; i++){
cout << a[i] << " ";
}
cout << a[c-1]<<endl;
}
}