假设数n在b进制下为回文数,求最小的b

题目链接:here

假设n=b0+b1+b2....+bk

如果b2<=n,那么那么n在b进制下有多个数组成,可以直接暴力算

如果暴力没有正确的结果,即:

如果b2>n,那么n在b进制下只有两个数组成

要组成回文树,则xb+x=n  b=n/x-1 ,(n%x==0,x<b),要求b最小,则使x最大, 从sqrt(n+1)开始枚举x即可

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
ll a[100];
bool ok(int k,ll n)
{
    int cnt=0;
    while(n)
    {
        a[cnt++]=n%k;
        n/=k;
    }
    for(int i=0;i<cnt/2;i++)
    {
        if(a[i]!=a[cnt-i-1])return false;
    }
    return true;
}
int main()
{
    int T;
    ll n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld",&n);
        bool flag=false;
        for(int i=2;i<100010;i++)
        {
            if(ok(i,n))
            {
                printf("%d\n",i);
                flag=true;
                break;
            }
        }
        if(flag)continue;
        int p=sqrt(n+1);
        for(int i=p;i>=1;i--)
        {
            if(n%i==0)
            {
                printf("%lld\n",n/i-1);
                break;
            }
        }
    }
    return 0;
}
/*
9974
*/
 

时间: 2024-11-05 22:02:25

假设数n在b进制下为回文数,求最小的b的相关文章

USACO 1.2 Palindromic Squares (进制转换,回文)

/* ID:twd30651 PROG:palsquare LANG:C++ */ #include<iostream> #include<fstream> #include<stdlib.h> #include<string.h> using namespace std; int BASE; char B[]={'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H',

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) 时,枚举

判断一个数的n进制是不是回文数

#include<stdio.h> int circle(int m,int n)//该函数判断m的n进制数是否为回文数 { int s=0,l=m; while(l) { s=s*n+l%n;//该语句是反顺序计算数值 l/=n; } return s==m;//如果是回文数,那么正反顺序的数字应该是相等的 } void main() { int num[]={434,783,909}; int sys[]={2,8,10,16}; int i,j; for(i=0;i<3;i++)

洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes

P1207 [USACO1.2]双重回文数 Dual Palindromes 291通过 462提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数. 编

每周一道算法题001:回文数

题目: 找出大于10的最小的2进制,8进制,10进制都是回文数的最小的数.回文数指的是正读和反读都是一样的数,例如:33,10001,123454321... 思路: 先转换进制,然后统一处理成字符串进行比较 解答: PHP function execute(){ $x = 11; while (1) { if ($x == strrev($x) && decbin($x) == strrev(decbin($x)) && decoct($x) == strrev(deco

n范围内的回文数

上课的时候浏览别人的博客发现这个问题的,以前也看到过,但是就是没有动手调试.今天贴上的代码,并且分析分析. 先上代码 #include "stdafx.h" #include "iostream.h" #include "math.h" bool is_huiwenshu(int x); int main(int argc, char* argv[]){ cout<<"输入一个数n,求该数内的回文数"<<

循环结构-回文数

编写程序计算车速: 一个人开车去旅行,某时刻发现里程表上显示98589.经过两个小时,第一次显示了下一个回文数.求里程以及速度. 回文数:一个数的数字排列正反相同,例如98589,13431 int main() { int s1 = 98589; int s2 = s1; int a, b, c; while (true) { s2++; //假设此数为10000a+1000b+100c+10b+a a = s2 / 10000; b = (s2 - a * 10000) / 1000; c

回文数 第N个回文数

判断回文数还是不难,如果能转为字符串就更简单了. 如果是求第N个回文数呢. 12321是一个回文数,这里先考虑一半的情况. 回文数的个数其实是有规律的.如: 1位回文数: 9个 2位回文数: 9个 3位回文数: 90个 4位回文数: 90个 5位回文数: 900个 6位回文数: 900个 … 我们看到9.90.900,是不是很有规律,那是什么原因?很简单,我们把回文数拆开两半 [123321]来看.两半的变化一样的,那我们只算其中一半就行了.首位不能是0,所以左半最小为 100,最大为999,共

C实例--判断一个字符串是否是回文数

回文是指顺读和反读内容均相同的字符串,例如"121","ABBA","X"等.本实例将编写函数判断字符串是否是回文. 引入两个指针变量,开始时,两个指针分别指向字符串的首末字符,当两个指针所指字符相等时,两个指针分别向后和向前移动一个字符位置,并继续比较,直到两个指针相遇,说明该字符串是回文,如果比较过程中发现两个指针指向的字符不相等,则判断该字符串不是回文. 下面是代码的实现部分: #include <stdio.h> #inclu