#include<cstdio> #include<cstring> #include<bitset> #include<cstdlib> #include<cmath> #include<iostream> #include<string> #include<vector> #include<queue> #include<deque> #include<set> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int N = 20; ll dp[N][10][1<<10][11]; int has[1<<10]; int ne[1<<10][10]; int bit[N],K; int go(int mask,int number){ int pos = -1; for(int i = number;i <=9;i++) if(mask & (1<<i)){ pos = i; break; } if(pos == -1)mask |= 1<<number; else{ mask ^= 1<<pos; mask |= 1<<number; } return mask; } void init(){ memset(dp,-1,sizeof(dp)); for(int i=0;i<1<<10;i++){ has[i] = 0; for(int j=0;j<10;j++) if(i&(1<<j))has[i]++; } for(int i = 0;i < 1<<10;i++) for(int j = 0;j < 10;j++) ne[i][j] = go(i,j); for(int i = 0;i < 15;i++){ for(int j=0;j<10;j++){ } } } ll dfs(int pos,int number,int mask,bool isZero,bool flag){ if(pos == 0)return has[mask] == K; if(flag && ~dp[pos][number][mask][K])return dp[pos][number][mask][K]; ll ans = 0; int u = flag ? 9:bit[pos]; for(int d = 0;d <= u;d++){ if(isZero && d == 0)ans += dfs(pos-1,d,0,1,flag || d < u); else{ ans += dfs(pos-1,d,ne[mask][d],0,flag || d < u); } } if(flag)dp[pos][number][mask][K] = ans ; return ans; } ll solve(ll n){ int len = 0; while(n){ bit[++len] = n % 10; n /= 10; } return dfs(len,0,0,1,0); } int main(){ init(); ll L,R; int T;cin >> T; for(int cas = 1;cas <= T;cas++){ cin >> L >> R >> K; cout<<"Case #"<<cas<<": "<<solve(R) - solve(L - 1)<<endl; } return 0; }