FZU2125_简单的等式

题目想到了就是一个水题。

提示一下,S(x,m)是一个很小的数。(不超过100)

这样直接枚举这个数,然后求方程的整数解,并且判断是否满足条件即可。

——————(一开始还用Pollard大整数分解+dfs的方法做,,深坑啊)

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;

ll n,m,k,t,x,ans;

ll count(int X)
{
    ll tot=0;
    while (X) tot+=X%m,X/=m;
    return tot;
}

ll Min(ll A1,ll A2) { return A1<=A2?A1:A2; }

int main()
{
    cin>>t;
    while (t--)
    {
        cin>>n>>m;
        ans=~0u>>1;
        for (int i=1; i<=100; i++)
        {
            k=sqrt(1.0*(i*i+4*n));
            if (k*k!=i*i+4*n) continue;
            x=k-i;
            if (x&1) continue;
            x>>=1;
            if (count(x)==i) ans=Min(ans,x);
        }
        if (ans==(~0U>>1)) cout<<"-1\n";
            else cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2013-11-20 17:06  092000  阅读(222)  评论(0编辑  收藏  举报