有如下方程:
x2 + s(x)·x - n = 0,
其中x, n是正整数, s(x) 是函数, 等于十进制数中x 的位数之和.
明明有一个整数 n, 请你帮明明找到方程x最小的正整数根,或者确定没有这样的根.
Input
第一行包含整数n (1 ≤ n ≤ 1018),是方程参数
请不要使用%lld 读入. 推荐使用 cin, cout 流或 %I64d
Output
输出 -1,如果方程没有正整数根. 否则输出这个最小的正整数根 x (x > 0)
Example
Input
2
Output
1
Input
110
Output
10
Input
4
Output
-1
Note
在样例x = 1 是最小的根. 因为 s(1) = 1 并且 12 + 1·1 - 2 = 0.
在样例二 x = 10 是最小的根. 因为 s(10) = 1 + 0 = 1 并且 102 + 1·10 - 110 = 0.
在样例三中方程没有根.
思路:
二元一次函数求解,解最大估计不超过1e10,而1e10中最大s(x)就是99了,直接暴力即可,但是要注意要求;
代码:
#include<cstdio>
#include<cmath>
int sum(__int64 x)
{
int sum = 0;
while (x > 0)
{
sum += x % 10;
x /= 10;
}
return sum;
}
int solve(__int64 x1,__int64 x2)
{
if (x1 > x2)
{
x1 = x1 + x2;
x2 = x1 - x2;
x1 = x1 - x2;
}
if (x1 > 0)
{
printf("%I64d\n",x1);
return 1;
}
else
if (x2 > 0)
{
printf("I64d\n",x2);
return 1;
}
return 0;
}
int main()
{
__int64 n,a1,a2;
scanf("%I64d",&n);
int i;
for (i = 1;i <= 81;i ++)
{
a1 = (- i + sqrt(i * i + 4 * n)) / 2,a2 = (- i + sqrt(i * i + 4 * n)) / 2;
if (sum(a1) == i && a1 * a1 + i * a1 - n == 0)
if (solve(a1,a2)) break;
}
if (i == 82) printf("-1\n");
return 0;
}