zoukankan      html  css  js  c++  java
  • [暑假集训--数位dp]LightOj1205 Palindromic Numbers

    A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the same when its digits are reversed. In this problem you will be given two integers i j, you have to find the number of palindromic numbers between i and j (inclusive).

    Input

    Input starts with an integer T (≤ 200), denoting the number of test cases.

    Each case starts with a line containing two integers i j (0 ≤ i, j ≤ 1017).

    Output

    For each case, print the case number and the total number of palindromic numbers between i and j (inclusive).

    Sample Input

    4

    1 10

    100 1

    1 1000

    1 10000

    Sample Output

    Case 1: 9

    Case 2: 18

    Case 3: 108

    Case 4: 198

    问 l 到 r 有多少回文

    枚举回文数的长度,然后数位dp。记一下当前位置是啥

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 #include<cmath>
     7 #include<queue>
     8 #include<deque>
     9 #include<set>
    10 #include<map>
    11 #include<ctime>
    12 #define LL long long
    13 #define inf 0x7ffffff
    14 #define pa pair<LL,LL>
    15 #define mkp(a,b) make_pair(a,b)
    16 #define pi 3.1415926535897932384626433832795028841971
    17 using namespace std;
    18 inline LL read()
    19 {
    20     LL x=0,f=1;char ch=getchar();
    21     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    22     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    23     return x*f;
    24 }
    25 int len;
    26 LL l,r;
    27 LL f[20][20][10];
    28 int zhan[20];
    29 int d[110];
    30 
    31 inline LL dfs(int now,int p,int dat,int fp)
    32 {
    33     if (now==(p+2)/2)
    34     {
    35         if (!fp)return 1;
    36         for (int i=now-1;i>=1;i--)
    37         {
    38             if (d[i]>zhan[p+1-i])return 1;
    39             if (d[i]<zhan[p+1-i])return 0;
    40         }
    41         return 1;
    42     }
    43     if (!fp&&f[now][p][dat]!=-1)return f[now][p][dat];
    44     LL ans=0;
    45     int mx=fp?d[now-1]:9;
    46     for (int i=0;i<=mx;i++)
    47     {
    48         zhan[now-1]=i;
    49         ans+=dfs(now-1,p,i,fp&&i==mx);
    50         zhan[now-1]=-1;
    51     }
    52     if (!fp)f[now][p][dat]=ans;
    53     return ans;
    54 }
    55 inline LL calc(LL x)
    56 {
    57     if (x==-1)return 0;
    58     if (x==0)return 1;
    59     LL xxx=x;
    60     len=0;
    61     while (xxx)
    62     {
    63         d[++len]=xxx%10;
    64         xxx/=10;
    65     }
    66     LL sum=1;
    67     for (int i=1;i<=len;i++)
    68     {
    69         for (int j=1;j<=(i==len?d[len]:9);j++)
    70         {
    71             zhan[i]=j;
    72             sum+=dfs(i,i,j,len==i&&j==d[len]);
    73             zhan[i]=-1;
    74         }
    75     }
    76     return sum;
    77 }
    78 int main()
    79 {
    80     LL T=read();int cnt=0;
    81     memset(f,-1,sizeof(f));
    82     while (T--)
    83     {
    84         l=read();
    85         r=read();
    86         if (r<l)swap(l,r);
    87         printf("Case %d: %lld
    ",++cnt,calc(r)-calc(l-1));
    88     }
    89 }
    LightOJ 1205
  • 相关阅读:
    Request和Session的生命周期
    了解EBP指针
    esp跟ebp跟踪记录
    深入浅出Node.js (6)
    洛谷 P2404 自然数的拆分问题
    洛谷 P1852 奇怪的字符串
    洛谷 P1433 吃奶酪
    洛谷 P1881 绳子对折
    洛谷 P1162 填涂颜色
    P1145 约瑟夫
  • 原文地址:https://www.cnblogs.com/zhber/p/7284465.html
Copyright © 2011-2022 走看看