/*
计算i,j (0 ≤ i, j ≤ 10^17) 之间的回文数的个数
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef long long LL;
LL dp[20][20][2];
int d[20],num[20];
LL dfs(int pos,int len, int pre, bool limit)
{
if( pos<=0 ) { return 1LL; }
if(!limit && dp[pos][len][pre]!=-1) { return dp[pos][len][pre]; }
int end= limit?d[pos]:9;
LL ans=0;
for(int i=0;i<=end;i++)
{
if( pre )
{
int le= (len+1)>>1;
if( (len&1)&&pos<le || (len&1)==0&&pos<=le)
{
if( num[len-pos+1]==i )
ans+=dfs( pos-1, len, pre, limit&&i==end);
}
else
{
num[pos]=i;
ans+=dfs(pos-1, len,pre, limit&& i==end);
}
}
else
{
num[pos]=i;
ans+=dfs(pos-1,len-!i, pre||i, limit&&i==end);
}
}
if(!limit && dp[pos][len][pre]==-1) dp[pos][len][pre]=ans;
return ans;
}
int main()
{
int t,i,j;
int cas=0;
LL a,b;
memset(dp,-1,sizeof(dp));
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&a,&b);
if(a>b) swap(a,b);
a--;
int p=0;
while(a)
{
d[++p]=a%10;
a/=10;
}
LL an=dfs(p,p,0,true);
p=0;
while(b)
{
d[++p]=b%10;
b/=10;
}
LL bn=dfs(p,p,0,true);
printf("Case %d: %lld\n",++cas,bn-an);
}
}
Light OJ 1205-Palindromic Numbers-数位DP
最新推荐文章于 2019-01-20 22:15:23 发布