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 ,不然在特殊的计算中可能会爆炸。

posted @ 2019-05-25 18:00  ChrisKKK  阅读(176)  评论(0编辑  收藏  举报