[暑假集训--数位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\n",++cnt,calc(r)-calc(l-1));
88     }
89 }

LightOJ 1205

时间: 2024-10-25 15:06:56

[暑假集训--数位dp]LightOj1205 Palindromic Numbers的相关文章

[暑假集训--数位dp]cf55D Beautiful numbers

Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue with this and just count the quantity of beautiful num

[暑假集训--数位dp]hdu3652 B-number

A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- string "13" and can be divided by 13. For example, 130 and 2613 are wqb-numbers, but 143 and 2639 are not. Your task is to calculate how many wqb

[暑假集训--数位dp]LightOj1032 Fast Bit Calculations

A bit is a binary digit, taking a logical value of either 1 or 0 (also referred to as "true" or "false" respectively). And every decimal number has a binary representation which is actually a series of bits. If a bit of a number is 1 a

[暑假集训--数位dp]LightOJ1140 How Many Zeroes?

Jimmy writes down the decimal representations of all natural numbers between and including m and n, (m ≤ n). How many zeroes will he write down? Input Input starts with an integer T (≤ 11000), denoting the number of test cases. Each case contains two

[暑假集训--数位dp]hdu5787 K-wolf Number

Alice thinks an integer x is a K-wolf number, if every K adjacent digits in decimal representation of x is pairwised different. Given (L,R,K), please count how many K-wolf numbers in range of L,RL,R . Input The input contains multiple test cases. The

[暑假集训--数位dp]hdu5898 odd-even number

For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18). Input First line a t,then t c

[暑假集训--数位dp]UESTC250 windy数

windy定义了一种windy数. 不含前导零且相邻两个数字之差至少为22 的正整数被称为windy数. windy想知道,在AA 和BB 之间,包括AA 和BB ,总共有多少个windy数? Input 包含两个整数,AA BB . 满足 1≤A≤B≤20000000001≤A≤B≤2000000000 . OutputSample Input 1 10 Sample Output 9 记一下上一位出现的数是啥 1 #include<cstdio> 2 #include<iostrea

Lightoj1205——Palindromic Numbers(数位dp+回文数)

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

[LightOJ1205]Palindromic Numbers(数位dp)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1205 题意:求[l,r]内回文数的数量. dp(s,l,ok)表示数字以s为开头,长度为l的时是/不是回文数 dp(s,l,ok)可以由dp(s,l-1,ok)更新来,当且仅当接下来插入的一位与s对应的位置相同. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 const i