#include<stdio.h> #include<string.h> #include<algorithm> #include<string.h> using namespace std; long long dp[30][3][30][3]; int dig[30]; long long dfs(int pos,int pre,int len,int inf ,int zero) { if(pos==0) { int ll=len%2; if(pre+ll==1)return 1; else return 0; } long long ans=0; if(!inf && dp[pos][pre][len][zero]!=0)return dp[pos][pre][len][zero]; int end=inf?dig[pos]:9; if(zero) { for(int i=0;i<=end;i++) { if(i==0)ans+=dfs(pos-1,0,0,inf && end==i,1); else if(i%2==1) { ans+=dfs(pos-1,1,1,inf && end==i,0); } else if(i%2==0) { ans+=dfs(pos-1,0,1,inf && end==i,0); } } } else for(int i=0;i<=end;i++) { if(i%2==1) { if(pre==1)ans+=dfs(pos-1,1,len+1,inf && end==i,0); if(pre==0 && len%2==1)ans+=dfs(pos-1,1,1,inf && end==i,0); } else if(i%2==0) { if(pre==0)ans+=dfs(pos-1,0,len+1,inf && end==i,0); if(pre==1 && len%2==0)ans+=dfs(pos-1,0,1,inf && end==i,0); } } if(!inf)dp[pos][pre][len][zero]=ans; return ans; } int main() { int i,j,k,m,n; long long l,r; int t; scanf("%d",&t); for(int kase=1;kase<=t;kase++) { memset(dig,0,sizeof(dig)); scanf("%lld%lld",&l,&r); int pos=0; l--; while(l>0) { dig[++pos]=l%10; l=l/10; } memset(dp,0,sizeof(dp)); long long ans1=dfs(pos,0,0,1,1); pos=0; memset(dig,0,sizeof(dig)); while(r>0) { dig[++pos]=r%10; r/=10; } memset(dp,0,sizeof(dp)); long long ans2=dfs(pos,0,0,1,1); printf("Case #%d: %lld\n",kase,ans2-ans1); } return 0; }
|