QOJ.ac

QOJ

时间限制: 2.0 s 内存限制: 512 MB 总分: 100

#14791. 精准射击

统计

苏菲(Sophie)计划夺取世界的控制权。目前,一台中央计算机控制着世界,但其软件存在严重的漏洞。苏菲要推翻计算机的统治,唯一需要做的就是将其变量 $z$ 的值设置为任何能被 $m$ 整除的整数。

目前,变量 $z$ 被设置为一个整数 $n$,以无前导零的二进制编码。在她的地下室里,苏菲建造了一门离子炮,其发射的炮弹可以翻转苏菲在计算机内存中选择的某一位(bit)。自然地,她将瞄准保存变量 $z$ 的寄存器,并且实际上可以通过精准的射击选择翻转其二进制表示中的任意一位。该离子炮只能翻转二进制表示(没有前导零!)中已有的位,不能用于在表示的任何位置(包括两端)插入新的位。然而,任何前导的 $1$ 都可以被翻转为 $0$。苏菲可以根据需要射击任意多次,但每次射击都会增加她的阴谋被发现的几率。因此,她希望最小化射击次数。

帮助苏菲夺取政权。编写一个程序,从标准输入中读取存储在变量 $z$ 中的当前值 $n$ 和一个数字 $m$,确定推翻计算机所需的最小射击次数、苏菲可以用最小射击次数将 $n$ 转换成的能被 $m$ 整除的不同整数的数量,以及这些整数中最小的一个,并输出这三个数字。

输入格式

输入的第一行也是唯一的一行包含两个由单个空格分隔的正整数:$n$ 和 $m$($1 \le n, m \le 10^{15}$)。前者是变量 $z$ 的初始值,而后者是 $z$ 的最终值应当是其倍数的数。

输出格式

应向标准输出打印三个由单个空格分隔的数字:推翻计算机统治所需的最小射击次数、在射击次数最少的情况下能确保推翻计算机的不同 $n'$ 的数量,以及这些 $n'$ 中的最小值。

样例

输入样例 1

30 7

输出样例 1

1 2 14

输入样例 2

69 41

输出样例 2

3 1 0

说明

在第一个样例中,变量的值为 $30$,即二进制的 $11110_{(2)}$。要使其成为 $7$ 的倍数,只需射击一次。有两种方法可以达到这个目的:将其转换为 $01110_{(2)} = 14$ 或 $11100_{(2)} = 28$。其中第一个值是最小的。

在第二个样例中,变量的值为 $69 = 1000101_{(2)}$。使其成为 $41$ 的倍数的唯一方法是将其转换为 $0 = 0000000_{(2)}$,这需要三次射击。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.