Codeforces-----233B---Non-square Equation暴力枚举

来源:互联网 发布:java语言编译器win10 编辑:程序博客网 时间:2024/06/05 07:34

Non-square Equation

time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Let's consider equation:

x2 + s(xx - n = 0, 

where x, n are positive integers,s(x) is the function, equal to the sum of digits of numberx in the decimal number system.

You are given an integer n, find the smallest positive integer root of equationx, or else determine that there are no such roots.

Input

A single line contains integer n (1 ≤ n ≤ 1018) — the equation parameter.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to usecin, cout streams or the%I64d specifier.

Output

Print -1, if the equation doesn't have integer positive roots. Otherwise print such smallest integerx (x > 0), that the equation given in the statement holds.

Examples
Input
2
Output
1
Input
110
Output
10
Input
4
Output
-1
Note

In the first test case x = 1 is the minimum root. Ass(1) = 1 and 12 + 1·1 - 2 = 0.

In the second test case x = 10 is the minimum root. Ass(10) = 1 + 0 = 1 and 102 + 1·10 - 110 = 0.

In the third test case the equation has no roots.

s(x)是x的各个位数字之和,因为x*x+x*s(x)-n = 0,即x*x+x*s(x)=n,n <= 1e18,所以x <= 999999999,即s(x) <= 81

且x,n为正整数,所以遍历s(x)即可,再根据一元二次方程求根公式(-b+sqrt(b*b-4*a*c))/ 2 判断s(x)与x是否满足即可

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<vector>#define PI acos(-1.0)#define INF 0x3f3f3f3f#define CL(a, b) memset(a, b, sizeof(a))using namespace std;typedef __int64 LL;const int MAXN = 5e5+10;const int MOD = 1e9+7; char s[50], str[50];bool judge(LL a, LL b, LL c){return a*a + a*b == c;}bool Judge(LL a, LL b){LL ans = 0;while(a){ans += a%10;a /= 10;}return ans == b;}int main(){      LL t, x, c, ans, kcase = 1;    scanf("%I64d", &t);bool flag = false;for(LL i = 1; i <= 81; i++){LL v = i*i+4*t;if(sqrt(v)*sqrt(v) == v){//x为正整数,v必定是完全平方数x = (sqrt(v)-i)/2;if(judge(x, i, t) && Judge(x, i)){flag = true;break;}}}printf("%I64d\n", flag ? x : -1);    return 0;  }

0 0
原创粉丝点击