1. 程式人生 > >[暑假集訓--數位dp]LightOj1205 Palindromic Numbers

[暑假集訓--數位dp]LightOj1205 Palindromic Numbers

num hat names xxx pen out ini output inpu

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

[暑假集訓--數位dp]LightOj1205 Palindromic Numbers