#include #include #include #define N 35 #define OVER 7 typedef unsigned long long ll; using namespace std; char B[N]; char A[N]; int dp[N][10][OVER+1]; int next(int now,int p,int q) { switch(now) { case 0:return p>0?1:OVER; case 1:return p>0?1:p<0?2:OVER; case 2:return p<0?3:q?4:OVER; case 3:return p<0?3:p&&q-p?5:q?4:OVER; case 4:return p>0?5:OVER; case 5:return p<0?6:p>0?5:OVER; case 6:return p<0?6:OVER; default:return OVER; } } void DP() { memset(dp,128,sizeof(dp)); for(int i = 0 ; i < 10 ; i++) dp[0][i][OVER-1] = i; for(int i = 1 ; i < N ; i++) for(int j = 0 ; j < 10 ; j++) for(int l = 0 ; l < OVER ; l++) for(int k = 0 ; k < 10 ; k++) dp[i][j][l] = max(dp[i][j][l] , dp[i-1][k][next(l,k-j,k)]+j); } int find(ll a,ll b) { sprintf(B,"%I64u",b); int len = strlen(B); sprintf(A,"%0*I64u",len--,a); int ii,sum = 0,now; for(ii = 0 ; A[ii] && A[ii]==B[ii] ; ii++) { now = !ii ? 0 : next(now,A[ii]-A[ii-1],A[ii]-'0'); sum += A[ii]-'0'; } int tsum = sum, tnow = now, ans = 0; for(int i = ii; B[i] ; i++) { for( int j = i==ii? A[i] - '0' + 1 : 0 ; j < B[i] - '0' ; j++) ans = max(ans,dp[len-i][j][!i ? 0 : next(now,j-B[i-1]+'0',j)]+sum); now = !i ? 0 : next(now,B[i]-B[i-1],B[i]-'0'); sum += B[i]-'0'; } if(!ii) { while(A[ii]=='0') { ii++; if(!A[ii])return ans; for(int i = A[ii]=='0'?1:A[ii]-'0'+1 ; i < 10 ; i++) ans = max(ans,dp[len-ii][i][0]); } now = 0; }else now = next(tnow,A[ii]-A[ii-1],A[ii]-'0'); sum = tsum + A[ii] - '0'; for(int i = ++ii;A[i]; i++) { for( int j = A[i] - '0' + 1 ; j < 10 ; j++) ans = max(ans,dp[len-i][j][next(now,j-A[i-1]+'0',j)]+sum); now = next(now,A[i]-A[i-1],A[i]-'0'); sum += A[i] - '0'; } return ans; } int main() { int t,cas = 1; ll a,b; scanf("%d",&t); DP(); while(t--) { scanf("%I64u %I64u",&a,&b); if(!a)a++; if(!(b+1))b--; printf("Case %d: %d\n",cas++,find(a-1,b+1)); } return 0; }