洛谷 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 \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);
        }
    }
}

 

转载于:https://www.cnblogs.com/rmy020718/p/9641175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值