Palindromic Numbers LightOJ

来源:互联网 发布:网络之纵横天下同人 编辑:程序博客网 时间:2024/06/11 14:19

题意:给你一个范围 i j (0i,j1017).,问你在这个范围中的数字有多少是回文数

#include <iostream>#include <cstring>#include <algorithm>#include <cmath>#include <cstdio>#include <vector>#include <set>#include <map>using namespace std;#define ll long longconst 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;}