问题描述

伊姐姐热衷于各类数字游戏, 24 点、 2048、数独等轻轻松松毫无压力。一
日,可爱的小姐姐邀请伊姐姐一起玩一种简单的数字 game,游戏规则如下:
一开始桌上放着 n 张数字卡片,从左到右按数字 1-n 放置,小姐姐按以下步
骤取卡片
小姐姐取出最左边的一张牌,藏于袖中;
小姐姐将此时剩余卡牌的最左边的 p 张移到最右边, 假设桌上的牌为 1 2 3 4
5,移动最左边的两张卡片后结果为 3 4 5 1 2。 注意当桌上卡片数量小于 p 时不
进行这步操作。
所有卡牌都被藏起来以后,游戏结束。
这是个十分简单的数字 game, 然而伊姐姐因为紧张丧失游戏能力, 你能帮
助伊姐姐统计, 小姐姐第 k 次,第 2*k 次…第 i*k 次(i<=n/k)藏于袖中的卡片吗?

★数据输入
输入第一行为三个正整数 n(1<=n<=100000),p(0<=p<=10),k(0<k<=100),含
义在题目中给出。

★数据输出
输出为两行,第一行输出你总共要输出的卡片数量 m。
第二行 m 个数, 按顺序输出小姐姐第 k 次,第 2*k 次…第 m*k 次藏的卡片。

输入示例 输出示例
6 3 2 3
5 6 3
输入示例 输出示例
10 1 3 3
5 2 8

思路

  测试数据较小,暴力

code

 #include <stdio.h>
#include <iostream>
using namespace std;
#include <queue> int main()
{
int i,j;
int n,p,k;
bool first=true; scanf("%d %d %d",&n,&p,&k);
printf("%d\n",n/k); queue<int> q;
for(i=;i<=n;i++)
q.push(i); for(i=; i<=n; i++)
{
if(i%k==)
{
if(first)
{
first = false;
printf("%d",q.front());
}
else
printf(" %d",q.front());
}
q.pop();
if(q.size()>p)//(q.size()>=p)
{
for(j=;j<=p;j++)
{
q.push(q.front());
q.pop();
}
}
} return ;
}
05-12 16:08