Power play
While analyzing a mathematical problem, a programmer, Basil by name, noticed an interesting fact: for the numbers 2 and 4 holds the equality 24=42. ‘This could be a great challenge for the participants of the programming championship,’ he thought. Unfortunately, Basil could not find other such pairs of numbers, the pair 2 and 4 was his only combination that he could think of. ‘Okay, then we’ll change the conditions, let there be three numbers,’ Basil decided. The written program of enumeration options confirmed that with three numbers the task made sense.
Your task: find the integer x by the given integers a and b such that falls in the range from 1 to 1018 (Basil’s program didn’t deal with greater numbers) such that ax=xb. If there are several such numbers, type the smaller of them. If such a number does not exist, type 0.
Input
The input data consist of two integers a and b (2≤a,b≤10000; a≠b), separated by a blank space.
Output
The integer x if there is a solution, or 0 (zero) if there is no solution.
Examples
Input
2 4
Output
16
Input
2 6
Output
0
Input
2 32
Output
256
Input
100 20
Output
10
要注意精度问题, log()函数后会有产生一点小误差,而且数据卡得很死,要把误差写很小才能过。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a, b;
LL f(LL l, LL r)
{
if (l > r) return 0;
LL mid = (l + r) / 2;
double s=double(log(mid)/log(a));
if (abs(s * b - mid) < 0.00000000001)
{
LL ans = f(1, mid - 1);
if (ans) return ans;
return mid;
}
if (mid > s * b)
return f(l, mid - 1);
return f(mid + 1, r);
}
int main()
{
int flag = 1;
scanf("%lld%lld", &a, &b);
printf("%lld\n", f(1, 1e18));
}