luogu_2425题解小红帽的回文数 (基本算法)

Posted chriskkk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu_2425题解小红帽的回文数 (基本算法)相关的知识,希望对你有一定的参考价值。

题目:https://www.luogu.org/problemnew/show/P2425

大意:求 t 个数,a[1.....t]  满足其在 x 进制下是回文数,求x。

题解:

1.可以枚举x,求出。(不知道可不可以)。

2.当 x 大于sqrt(a) 时,数字会只有两位数。

 所以设 i 为两位数的分别的数字。

 有 i * x + i == a 

 化简 x= a / i - 1

 所以 i 大于 sqrt(a),且当 i 是 a 的因数时,右边就是答案。

 当 i 小于 sqrt(a) 时,枚举 x 。

 代码如下。

#include<bits/stdc++.h>
using namespace std;
int t;
long long num[1010];
inline bool pd(long long n,long long x){
    long long z=n,m=0;
    while(z>0){
        m++;
        num[m]=z%x;
        z=z/x;
    }
    for(int i=1;i<=m/2;i++)
        if(num[i]!=num[m-i+1]) 
            return 0;
    return 1;
}
int main()
{
    scanf("%d",&t);
    while(t--){
        bool b=0;
        long long a;
        scanf("%lld",&a);
        long long i=1;
        do
        {
            i++;
            if(pd(a,i)){
                printf("%lld\n",i);b=1;break;
            }
        }while(i<=sqrt(a)-1);
        if(b==0)
            for(int i=a/sqrt(a)-1;i>=1;i--)
                if(a%i==0){ 
                    printf("%lld\n",a/i-1);
                    break; 
                }
    }
    return 0;
}

 不要忘了开 long long ,不然在特殊的计算中可能会爆炸。

以上是关于luogu_2425题解小红帽的回文数 (基本算法)的主要内容,如果未能解决你的问题,请参考以下文章

算法——回文串专题

算法题2425. 所有数对的异或和

[luogu p1015] 回文数

BZOJ 2425 [HAOI2010]计数:数位dp + 组合数

题解luogu2045 方格取数游戏加强版

ACM入门之manacher(马拉车)算法