CodeForces - 233B Non-square Equation

有如下方程:

x2 + s(xx - 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值