题目想到了就是一个水题。
提示一下,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
";
else cout<<ans<<endl;
}
return 0;
}