FZU 2125 简单的等式
2016-04-06 23:40
323 查看
Problem 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)。
分析:s(x,m)的大小有限,可以利用。枚举它得出方程解,再验证代入方程看是否正确。我把x的数据类型定义为 int ,10^9应该也是可以的啊。不知道为什么。改成long long 型就过了!
现在有一个等式如下: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)。
分析:s(x,m)的大小有限,可以利用。枚举它得出方程解,再验证代入方程看是否正确。我把x的数据类型定义为 int ,10^9应该也是可以的啊。不知道为什么。改成long long 型就过了!
#include<iostream> #include<cstring> #include<algorithm> #include<string> #include<cmath> using namespace std; long long n,m; int fun(int x) { int sum=0; while(x) { sum+=x % m; x/=m; } return sum; } int main() { int t; cin>>t; while(t--) { int flag=0; cin>>n>>m; for(int i=1;i<=1000;i++) { int x=(-i+sqrt(i*i+4*n))/2;//枚举解 int y=fun(x); if(n-x*x-y*x==0) { cout<<x<<endl; flag=1; break; } } if(!flag) cout<<-1<<endl; } return 0; }
相关文章推荐
- 例解 Linux 下 Make 命令
- Linux高性能服务器编程笔记1
- IOS开发之OC学习笔记(下)
- [IO]——FileUtil
- c++智能指针的简单实现
- 值得推荐的C/C++框架和库 (真的很强大)
- Python实例3
- JSP与Velocity的比较
- python之路(入门)
- sql语句优化
- 拍照怎么搜题?(上)
- 事件
- Application、Activity Stack 和 Task的区别
- EventBus Demo
- 使用自定义ui的ShareSDK短信验证码功能
- 如何扩大VMware虚拟机的硬盘磁盘空间大小
- 删除数据表中除id外其他字段相同的冗余信息
- Ueditor 前后端数据交互
- GET URL设置值为true 和'true'的区别,me和'me'的区别
- 解决UI主线程阻塞原因