想要真正理解这个题的本质真的很难,但可以根据题目中给出的公式进行把代码写出来
/*
看了很多题解,对于此题中的公式暂未真正了解其含义,此题就是提取出题目中的公式,利用公式算出最优的的K,以及最小的A和B
*/
#include <iostream>
using namespace std;
int main()
{
long long n, sp, sq;//定义long long 防止溢出
long long minK, minA, minB, A, B;
while (cin >> n >> sp >> sq)
{
minK = n * sq << 10;
// 因为是int 类型所有只需让A<32即可
for (A = 0; A < 32; A++)
for (B = 0; B < 32; B++)
{
long long tp = (((n - 1) * sp + ((n - 1) * sp << A)) >> B) + sq; //套用前面的公式,根据第一和第二个公式计算q
if (tp >= n * sq && tp < minK)//算出新的A和Bmink用的
{
minK = tp;
minA = A;
minB = B;
}
}
cout << minK << " " << minA << " " << minB << endl;
}
return 0;
}