简单的等式

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

这道题数据真的好水,这样也能过。很简单的题目。

第一种方法,可以过。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<ctype.h>
using namespace std;
int main()
{
    int t,m;
    long long i,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%d",&n,&m);
        long long x=sqrt(n);
        int f=0;
        for( i=x;i>0 ; i--)
        {
                if(n/i-i>=100)
                break;
                long long x1=i,sum=0;
                while(x1)
                {
                    sum+=x1%m;
                    x1/=m;
                }
                if(i*(i+sum)==n)
                {
                    f=1;
                    break;
                }
        }
        if(f)
            printf("%I64d\n",i);
        else
            printf("-1\n");
    }
    return 0;
}

还有一种方法,通过枚举s(x,m)来算x,然后输出x。
通过题目,求出s(x,m)的范围是0~100,然后枚举s(x,m),然后求出x。
具体的代码去看FZU-2125-简单的等式,这里会给出具体的思路以及代码解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值