FZU-2125- 简单的等式
2016-03-31 08:19
288 查看
E - 简单的等式
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit
Status
Practice
FZU 2125
Description
现在有一个等式如下:x^2+s(x,m)x-n=0。其中s(x,m)表示把x写成m进制时,每个位数相加的和。现在,在给定n,m的情况下,求出满足等式的最小的正整数x。如果不存在,请输出-1。
Input
有T组测试数据。以下有T(T<=100)行,每行代表一组测试数据。每个测试数据有n(1<=n<=10^18),m(2<=m<=16)。
Output
输出T行,有1个数字,满足等式的最小的正整数x。如果不存在,请输出-1。
Sample Input
4
4 10
110 10
15 2
432 13
Sample Output
-1
10
3
18
考数学,考一元二次方程的求解。
s(x,m)的区间[1,100],只是粗略的估算,但不影响做题。
s(x,m)最小值为1,这个一眼就能看出来。接下来求它的最大值。
我只是粗略估算一下,2的100次方大于10的18次方。那2的100次方转换为二进制时各个位数相加的和肯定小于100,那我就取右边界为100.
为什么不转换为16进制?因为这样得到的返回值只会更小,不信自己拿笔算。
思路:不要枚举x,枚举s(x,m)。最多一百次,怎么会超时
原方程变为x*x+s(x,m)*x-n=0;s(x,m)看成可以被枚举的已知数,那这就是关于x的一元二次方程了。经过配方开平方,可以得到
x=sqrt(n+(s(x,m)/2)*(s(x,m)/2))-s(x,m)/2;
通过配方得出x的值以后,带入s(x,m),再带入原方程检验即可。
代码
注意数据类型
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit
Status
Practice
FZU 2125
Description
现在有一个等式如下:x^2+s(x,m)x-n=0。其中s(x,m)表示把x写成m进制时,每个位数相加的和。现在,在给定n,m的情况下,求出满足等式的最小的正整数x。如果不存在,请输出-1。
Input
有T组测试数据。以下有T(T<=100)行,每行代表一组测试数据。每个测试数据有n(1<=n<=10^18),m(2<=m<=16)。
Output
输出T行,有1个数字,满足等式的最小的正整数x。如果不存在,请输出-1。
Sample Input
4
4 10
110 10
15 2
432 13
Sample Output
-1
10
3
18
考数学,考一元二次方程的求解。
s(x,m)的区间[1,100],只是粗略的估算,但不影响做题。
s(x,m)最小值为1,这个一眼就能看出来。接下来求它的最大值。
我只是粗略估算一下,2的100次方大于10的18次方。那2的100次方转换为二进制时各个位数相加的和肯定小于100,那我就取右边界为100.
为什么不转换为16进制?因为这样得到的返回值只会更小,不信自己拿笔算。
思路:不要枚举x,枚举s(x,m)。最多一百次,怎么会超时
原方程变为x*x+s(x,m)*x-n=0;s(x,m)看成可以被枚举的已知数,那这就是关于x的一元二次方程了。经过配方开平方,可以得到
x=sqrt(n+(s(x,m)/2)*(s(x,m)/2))-s(x,m)/2;
通过配方得出x的值以后,带入s(x,m),再带入原方程检验即可。
代码
#include <iostream> #include<algorithm> #include<stdio.h> #include<math.h> #include<string> #include<string.h> using namespace std; int s(long long int x,long long int m) { int sum=0; while(x) { sum+=x%m; x=x/m; } return sum; } int main() { int T; scanf("%d",&T); while(T--) { long long int n,m; scanf("%I64d%I64d",&n,&m); long long int num_x=-1;//初始化 for(int i=1;i<100;i++)//i代表s(x,m)参数 { long long int flag=sqrt(n*4+i*i)/2-i/2;//求根公式得到 if(flag*flag+s(flag,m)*flag==n)//带入原方程检验 { num_x=flag; break; } } printf("%I64d\n",num_x); } }
注意数据类型
相关文章推荐
- 第五周项目一 三角形类雏形3
- 第四周 项目3(2)小学生算数能力测试系统
- 关于时间的类
- 关于时间的类
- 关于时间的类
- 关于时间的类
- 关于时间的类
- 78. Subsets
- 小学生加减乘除
- 小学生加减乘除
- 小学生加减乘除
- 小学生加减乘除
- 小学生加减乘除
- java基础面试题:冒泡排序
- 第5周项目1-三角形类雏形
- 第五周项目二游戏中的角色类
- IOS开发-UI学习-根据URL显示图片,下载图片的练习(button,textfield,image view,url,data)
- 听说alphago又要挑战sc2了?——我眼中的人工智能
- java基础面试题:String和StringBuffer的区别
- 第五周项目一 - 三角形类雏形一