bunoj 13124(数位dp)

 数位dp每次都给我一种繁琐的感觉。。

A - Palindromic Numbers
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu
Submit Status

Description

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 (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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <sstream>
#include <iostream>
using namespace std;
#define INF 0x3fffffff

typedef __int64 LL;

LL save[20];
int bit[20];
int cnt;
LL dp[20];


LL get(LL x)
{
    if(x==0) return 1;
    LL tx=x;
    cnt=0;
    while(x)
    {
        bit[++cnt]=x%10;
        x/=10;
    }
    LL ans=0;
    ans=dp[cnt-1];
    for(int i=1;i<bit[cnt];i++)
    {
        if(cnt-2>=0)
            ans+=save[cnt-2];
        else ans++;
    }
    if(cnt==1) return ans+1; //
    int tmp=4;
    for(int i=2;i<=(cnt+1)/2;i++)
    {
        if( cnt-tmp>=0)
            ans += save[cnt-tmp]*bit[cnt-i+1];
        else ans += bit[cnt-i+1];
        tmp+=2;
    }
    int bit1[20];

    for(int i=1;i<=(cnt+1)/2;i++)
    {
        bit1[cnt-i+1]=bit[cnt-i+1];
        bit1[i]=bit[cnt-i+1];
    } //

    LL sum=0;
    for(int i=cnt;i>=1;i--)
        sum=sum*10+bit1[i];
    if(sum<=tx) ans++;
    return ans;
}


void dfs(int s)
{
    LL sum=0;
    if(s==1)
    {
        dp[1]=10;
        return ;
    }
    dfs(s-1);
    sum += dp[s-1];
    sum += 9*(save[s-2]);
    dp[s]=sum;
}


int main()
{
    //freopen("C:\Users\Administrator\Desktop\in.txt","r",stdin);
    //freopen("C:\Users\Administrator\Desktop\in.txt","w",stdout);
    save[0]=1;
    for(int i=1;i<=18;i++)
    {
        LL tmp=1;
        if(i%2==0)
        {
            for(int j=0;j<i/2;j++)
                tmp*=10;
        }
        else
        {
            for(int j=0;j<i/2+1;j++)
                tmp*=10;
        }
        save[i]=tmp;
    }
    dp[0]=1;
    dfs(18);
    int T;
    scanf("%d",&T);
    int tt=1;
    int kk=0;
    for(int i=1;i<=100000000;i++)
        kk++;

    while(T--)
    {
        LL a,b;
        cin>>a>>b;
        if(a>b) swap(a,b);
        if(a==0)
        {
            a=0;
        }
        else
            a=get(a-1);
        b=get(b);
        cout<<"Case "<<tt++<<": ";
        cout<<b-a<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chenhuan001/p/3350119.html