CF1040B Shashlik Cooking

原题链接:http://codeforces.com/contest/1040/problem/B

Shashlik Cooking

Long story short, shashlik is Miroslav’s favorite food. Shashlik is prepared on several skewers simultaneously. There are two states for each skewer: initial and turned over.

This time Miroslav laid out n n n skewers parallel to each other, and enumerated them with consecutive integers from 1 1 1 to n n n in order from left to right. For better cooking, he puts them quite close to each other, so when he turns skewer number i i i, it leads to turning k k k closest skewers from each side of the skewer i i i, that is, skewers number i − k , i − k + 1 , ⋯   , i − 1 , i + 1 , ⋯   , i + k − 1 , i + k i−k, i−k+1, \cdots, i−1, i+1,\cdots, i+k−1, i+k ik,ik+1,,i1,i+1,,i+k1,i+k (if they exist).

For example, let n = 6 n=6 n=6 and k = 1 k=1 k=1. When Miroslav turns skewer number 3 3 3, then skewers with numbers 2 , 3 2, 3 2,3, and 4 4 4 will come up turned over. If after that he turns skewer number 1 1 1, then skewers number 1 , 3 1, 3 1,3, and 4 4 4 will be turned over, while skewer number 2 2 2 will be in the initial position (because it is turned again).

As we said before, the art of cooking requires perfect timing, so Miroslav wants to turn over all n n n skewers with the minimal possible number of actions. For example, for the above example n = 6 n=6 n=6 and k = 1 k=1 k=1, two turnings are sufficient: he can turn over skewers number 2 2 2 and 5 5 5.

Help Miroslav turn over all n n n skewers.

Input

The first line contains two integers n n n and k ( 1 ≤ n ≤ 1000 , 0 ≤ k ≤ 1000 ) k (1≤n≤1000, 0≤k≤1000) k(1n1000,0k1000) — the number of skewers and the number of skewers from each side that are turned in one step.

Output

The first line should contain integer l l l — the minimum number of actions needed by Miroslav to turn over all n n n skewers. After than print l l lintegers from 1 1 1 to n n n denoting the number of the skewer that is to be turned over at the corresponding step.

Examples
input

7 2

output

2
1 6

input

5 1

output

2
1 4

Note

In the first example the first operation turns over skewers 1 , 2 1, 2 1,2 and 3 3 3, the second operation turns over skewers 4 , 5 , 6 4, 5, 6 4,5,6 and 7 7 7.

In the second example it is also correct to turn over skewers 2 2 2 and 5 5 5, but turning skewers 2 2 2 and 4 4 4, or 1 1 1 and 5 5 5 are incorrect solutions because the skewer 3 3 3 is in the initial state after these operations.

题解

直接对 2 × k + 1 2\times k+1 2×k+1取模,如果余数大于 k k k,就可以直接在后面补一个;否则我们就把第一个也往前调一点。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=1e3+5;
int n,k,st=1;
void in(){scanf("%d%d",&n,&k);}
void ac()
{
	if(n%(2*k+1)>k)st=k+1,printf("%d\n",n/(2*k+1)+1);
	else if(n%(2*k+1)==0)st=k+1,printf("%d\n",n/(2*k+1));
	else printf("%d\n",n/(2*k+1)+1);
	for(;st<=n;st+=2*k+1)printf("%d ",st);
}
int main(){in(),ac();}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值