分段枚举。。
[2 , sqrt( x ) ] 和 剩余部分
剩余部分可知必定为2位数、
且有
sta ∗ x+ sta = a;
sta * (x+1)=a;
x= a / sta - 1;
那么就好处理了
以下是 AC 代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
#define ll long long
inline ll read()
{
ll s=0;char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
return s;
}
ll a[10000];
bool f;
bool judge(ll c,ll sta)
{
f=1;
int pos=0;
while(c)
{
a[++pos]=c-c/sta*sta;
c/=sta;
}
for(ll i=1,j=pos;i<=j;i++,j--)
{
if(a[i]!=a[j])
{
f=0;
return f;
break;
}
}
return f;
}
int main()
{
ll n=read();
while(n--)
{
ll x=read();
if(x==2)
{
printf("3\n");
continue;
}
if(x<=3)
{
printf("2\n");
continue;
}
ll p=(ll)sqrt((double)x)+1;
for(ll i=2;i<=p;i++)
{
if(judge(x,i))
{
printf("%lld\n",i);
break;
}
}
if(!f)
{
for(ll i=p-1;i>=0;i--)
{
if(x==x/i*i)
{
printf("%lld\n",x/i-1);
f=1;
break;
}
}
if(!f)
printf("%lld\n",x+1);
}
}
return 0;
}