C/C++ 留下的士兵

题目描述

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值