留下的士兵

题目描述

有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;
	}
}

猜你喜欢

转载自blog.csdn.net/A_I_Q/article/details/82187102
今日推荐