题意:给你一个范围 i j (0≤i,j≤1017). ,问你在这个范围中的数字有多少是回文数
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define ll long long
const int maxn = 20;
ll dp[maxn][maxn];
int s[maxn];
ll dfs(int pos,int r,int l,int f,int limit)
{
if(r<l) return !limit||(limit&&f);
if(!limit&&dp[pos][r]!=-1) return dp[pos][r];
int a = limit?s[r]:9;
ll ret=0;
for(int i=0;i<=a;i++)
{
if(pos==r&&i==0) continue;//前导0
int g=f;
if(g) g=s[l]>=i;
else g=s[l]>i;
ret+=dfs(pos,r-1,l+1,g,limit&&i==a);
}
if(!limit) dp[pos][r]=ret;
return ret;
}
ll solve(ll r)
{
memset(s,0,sizeof(s));
int u=0;
if(r<0) return 0;
if(r==0) return 1;
while(r)
{
s[++u]=r%10;
r=r/10;
}
ll ans=0;
for(int i=u;i>=1;i--)
{
ans+=dfs(i,i,1,1,i==u);
}
return ans+1;
}
int main()
{
int T;
scanf("%d",&T);
int case1=1;
memset(dp,-1,sizeof(dp));
while(T--)
{
ll l,r;
scanf("%lld %lld",&l,&r);
if(l>r) swap(l,r);
printf("Case %d: %lld\n",case1++,solve(r)-solve(l-1));
}
return 0;
}