洛谷 2425 小红帽的回文数

https://www.luogu.org/problemnew/show/P2425#sub

题目要求找到一个最小进制使这个数转为回文数,假设数字为a,那么当进制$sta >= a$时,sta进制下a为a,仅为一位数那么为回文数,然而当&sta=a-1&时,sta进制下数位11,也是回文数,然而题目中要求找到最小的回文数。

我们想当$sta > sqrt a$时,转制以后这个数为二位数,因为要为回文数,那么第一位数和第二位数相等,我们假设都等于$j$,那么可以得出

$$j imes sta+j=a$$

$$j imes (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
");
            continue;
        }
        if(x<=3)
        {
            printf("2
");
            continue;
        }
        LL p=(LL)sqrt((double)x)+1;
        for(LL i=2LL;i<=p;i++)
        {
            if(judge(x,i))
            {
                printf("%lld
",i);
                break;
            }
        }
        if(!f)
        {
            for(LL i=x/p-1;i>=0;i--)
            {
                if(x==x/i*i)
                {
                    printf("%lld
",x/i-1);
                    f=1;
                    break;
                }
            }
            
            if(!f)printf("%lld
",x+1);
        }
    }
}
原文地址:https://www.cnblogs.com/rmy020718/p/9641175.html