#P10012. 约瑟夫做慈善
约瑟夫做慈善
题目背景
约瑟夫问题,如果仅仅是输出最后出圈人的编号,可以参阅下面博文中介绍的算法提高程序效率:
题目描述
你一定听说过约瑟夫问题吧?现在老约瑟夫将组织一个皆大欢喜的新游戏。
假设 个人站成一圈,依次编号为 ,从编号为 的人开始数数,数到 的人暂时出圈,然后出圈那个人的下一个人又重新从 开始数数,数到 的人又暂时出圈……这样一直持续下去,直到最后剩下唯一的幸运儿为止。幸运儿选出后,之前出圈的人全部回到原位置,所有比幸运儿编号 小
的人每人得到 个金币,然后退出游戏,其余人留下按原来的相对位置重新站成一个圈,这样一轮游戏结束。
接下来开始下一轮游戏,由圈内上一轮游戏的幸运儿的下一个人从 开始数数,和上一轮一样开始新一轮的游戏。就这样一直进行多轮游戏,一旦发现不再有人退出则终止游戏,最后剩下的那些人将得到 个金币。请你计算一下游戏终止时圈内还剩下多少人,老约瑟夫一共要付出多少金币?并按照最后一轮数数的先后顺序依次输出圈内所有人的编号。
输入格式
一行,两个正整数 。
输出格式
两行,第一行是用一个空格隔开的两个整数。分别是游戏终止时圈内还剩余的人数和老约瑟夫一共要付出的金币数量。第二行按照最后一轮数数的先后顺序依次输出圈内所有人的编号,相邻数据间用一个空格隔开。
输入输出样例
5 2
3 8
4 5 3
320 123456
67 387
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 254
1000000 999999
1 1000001
1000000
说明/提示
👀️ 对于 的数据,。
相关
在下列比赛中: