您的位置:首页 > 其它

FZU2125 简单的等式(枚举)

2015-08-08 17:32 351 查看
现在有一个等式如下: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)是有一个范围的。。
#include <stdio.h>   
#include <string.h>  
#include <math.h>  
int main()  
{  
    long long t,n,m,ans;  
    scanf("%I64d",&t);  
    while(t--)  
    {  
        scanf("%I64d%I64d",&n,&m);  
       long long x = sqrt(n*1.0);  
        ans = -1;  
        while(x)  
        {  
            if(n%x==0)  
            {  
                long long sum = 0,tem = x;  
                while(tem)  
                {  
                    sum+=tem%m;  
                    tem/=m;  
                }  
                if(sum == n/x-x)  
                {  
                    ans = x;  
                }  
            }  
            if(n/x-x>90)  
                break;  
            x--;  
        }  
        printf("%I64d\n",ans);  
    }  
	return 0;  
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: