https://www.luogu.org/problemnew/show/P2425#sub
题目要求找到一个最小进制使这个数转为回文数,假设数字为a,那么当进制$sta >= a$时,sta进制下a为a,仅为一位数那么为回文数,然而当&sta=a-1&时,sta进制下数位11,也是回文数,然而题目中要求找到最小的回文数。
我们想当$sta > \sqrt a$时,转制以后这个数为二位数,因为要为回文数,那么第一位数和第二位数相等,我们假设都等于$j$,那么可以得出
$$j \times sta+j=a$$
$$j \times (sta+1)=a $$
$$sta=a/j-1$$
这是很显然的,当然j是a的一个因子。
对于$sta \le \sqrt a$,暴力枚举判断一下就好了,不担心超时。
注意:循环变量一定写 long long,开着int WA了2遍。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; #define LL long long LL n,a[10000],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 x; scanf("%lld",&n); while(n--) { scanf("%lld",&x); if(x==2) { printf("3\n"); continue; } if(x<=3) { printf("2\n"); continue; } LL p=(LL)sqrt((double)x)+1; for(LL i=2LL;i<=p;i++) { if(judge(x,i)) { printf("%lld\n",i); break; } } if(!f) { for(LL i=x/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); } } }