Codeforces Round #144 (Div. 2) B. Non-square Equation 数学解一元二次方程+分析
http://codeforces.com/problemset/problem/233/B
题意:
x2 + s(x)·x - n = 0, 给出n的值,求x的值,这里s(x)表示x各位数字的和。
思路:
才开始我错误的认为x^2 + s(x)*x 是一个单调递增函数,于是分析x<10^9然后二分枚举log(10^9)即可,结果写完后样例都没过。原来这个函数不是单调函数10 = 110 9 = 162 所以非单调。
一时蒙了。还是做的数学题目比较少吧,思路还不够开阔。这里我能够得到x<10^9那么s(x)< 10*9 = 90 我们只要枚举s(x) 然后得到一个普通的一元二次方程,a*x^2 + b*x + c = 0然后根据公式
x = (-b +or - sqrt(b^2 -4*a*c )/2这里我们求的都是整数解,所以在计算的时候我们要保证得到的解是整数才可。
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <map> #include <string> #define CL(a,num) memset((a),(num),sizeof(a)) #define iabs(x) ((x) > 0 ? (x) : -(x)) #define Min(a,b) (a) > (b)? (b):(a) #define Max(a,b) (a) > (b)? (a):(b) #define ll long long #define inf 0x7f7f7f7f #define MOD 1073741824 #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define test puts("<------------------->") #define maxn 100007 #define M 1000007 #define N 100007 using namespace std; //freopen("data.in","r",stdin); ll sum(ll x){ ll res = 0; while (x != 0){ res += x%10; x /= 10; } return res; } int main(){ int i; ll n; cin>>n; ll res = -1; for (i = 1; i <= 90; ++i){ ll root = i*i + 4*n; ll tmp = sqrt(root); if (tmp * tmp == root){//保证整数解 tmp = (tmp - i); if (tmp%2 == 0 && sum(tmp/2) == (ll)i){//枚举b得到x然后检查x是否满足条件 if (res == -1) res = tmp/2; else res = min(res,tmp/2); } } } cout<<res<<endl; return 0; }
这里还有一个解法,很多人都是这么过的,又是一个经典的骗数据。
因为x=<sqrt(n)那么解一定[1,sqrt(n)]里面,我们只要枚举sqrt(n)坐标100个点即可把数据骗过。
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <map> #include <string> #define CL(a,num) memset((a),(num),sizeof(a)) #define iabs(x) ((x) > 0 ? (x) : -(x)) #define Min(a,b) (a) > (b)? (b):(a) #define Max(a,b) (a) > (b)? (a):(b) #define ll __int64 #define inf 0x7f7f7f7f #define MOD 1073741824 #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define test puts("<------------------->") #define maxn 100007 #define M 1000007 #define N 100007 using namespace std; //freopen("data.in","r",stdin); ll f(ll a){ ll tmp = a; ll sum = 0; while (tmp != 0){ sum += tmp%10; tmp /= 10; } return (a*a + a*sum); } int main(){ ll n; int i; while (cin>>n){ ll tp = sqrt(n); for (i = max(tp - 100, 1ll); i <= tp; ++i){ if (f(i) == n){ printf("%d\n",i); break; } } if (i > tp) printf("-1\n"); } return 0; }