zoukankan      html  css  js  c++  java
  • [洛谷P2425]小红帽的回文数

    原题传送门

    这道题需要枚举。如果直接枚举会$TLE$。

    考虑进制的转换:对于$> x$的进制下,一定是回文数

    回文长度$2$位:设每一位为$i$,进制为$x$,则该数为$i*x+i$。反之,如果$n=i*(x+1)$,则$x$进制下$n$为回文。但要满足$i<x$,所以$x>sqrt{n}$时适用。

    当$x leq sqrt{n}$时暴力判断,这样复杂度降为$O(T sqrt{n})$。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define re register
     6 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
     7 #define repd(i, a, b) for (re int i = a; i >= b; --i)
     8 #define maxx(a, b) a = max(a, b);
     9 #define minn(a, b) a = min(a, b);
    10 #define LL long long
    11 #define INF (1 << 30)
    12 
    13 inline LL read() {
    14     LL w = 0; int f = 1; char c = getchar();
    15     while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
    16     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar();
    17     return w * f;
    18 }
    19 
    20 int T, l[40];
    21 LL n;
    22 
    23 int main() {
    24     T = read();
    25 
    26     rep(kase, 1, T) {
    27         n = read();
    28         if (n == 2) printf("%d
    ", 3);
    29         else if (n <= 3) printf("%d
    ", 2);
    30         else {
    31             register LL ans = INF;
    32             for (register int i = sqrt(n-1); i; i--)
    33                 if (!(n - n / i * i)) {
    34                     ans = n / i - 1;
    35                     break;
    36                 }
    37             register int range = sqrt(n), len;
    38             register bool flag;
    39             register LL x;
    40             for (register int i = 2; i <= range; ++i) {
    41                 x = n;
    42                 len = 0;
    43                 while (x) {
    44                     l[++len] = x - x / i * i;
    45                     x /= i;
    46                 }
    47                 flag = 1;
    48                 for (register int j = 1; j <= len / 2; j++)
    49                     if (l[j] != l[len - j + 1]) {
    50                         flag = 0;
    51                         break;
    52                     }
    53                 if (flag) { ans = i; break; }
    54             }
    55             printf("%lld
    ", ans);
    56         }
    57     }
    58 
    59     return 0;
    60 }

     另外这道题比较卡常,需要一定的优化。

  • 相关阅读:
    Oracle存储过程 一个具体实例
    quartz定时格式配置以及JS验证
    day10_多进程、协程
    day10_锁、守护进程
    day10_单线程和多线程下载文件
    day10_多线程把六个网站写到文件里
    day10_主线程等待子线程的两种方式
    day10_修改父类的构造方法(不重要)和鸭子类型
    day10_hasattr和getattr、setattr、delattr和property的用法
    pycharm professional2019.1破解过程
  • 原文地址:https://www.cnblogs.com/ac-evil/p/10330905.html
Copyright © 2011-2022 走看看