import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

public class Recycled {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int t = Integer.parseInt(br.readLine());
            for (int i = 0; i < t; i++) {
                String[] str = br.readLine().split(" ");
                int a = Integer.parseInt(str[0]);
                int b = Integer.parseInt(str[1]);
                System.out.println("Case #" + (i + 1) + ": " + find(a, b));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static int find(int a, int b) {
        HashSet<Long> used = new HashSet<Long>();
        int digits = String.valueOf(a).length();
        if (digits == 1) return 0;
        for (int i = a; i <= b; i++) {
            int s = 10;
            int m = (int) Math.pow(10, digits-1);
            for (int j = 0; j < digits-1; j++) {
                int r = i % s;
                if (r < s/10) continue;
                int q = i / s;
                int rn = r * m + q;
                s *= 10; m /= 10;
                if (i != rn && rn >= a && rn <= b) {
                    long pp;
                    if (rn < i) pp = (long)rn << 30 | i;
                    else pp = (long)i << 30 | rn;
                    if (!used.contains(pp)) {
                        used.add(pp);
                    }
                }
            }
        }
        return used.size();
    }
}

package org.moriraaca.codejam;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.fail;

import java.io.BufferedReader;
import java.io.File;
import java.io.FilenameFilter;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(value = Parameterized.class)
public abstract class AbstractTest {
	private final static String TEST_RESOURCE_DIR = "src/test/resources";

	@Parameters
	public static Collection<Object[]> getFileNames() {
		String[] fileNames = new File(TEST_RESOURCE_DIR)
				.list(new FilenameFilter() {
					public boolean accept(File dir, String name) {
						return name.endsWith(".in");
					}
				});

		List<Object[]> result = new LinkedList<Object[]>();
		for (String fileName : fileNames) {
			result.add(new Object[] { fileName.substring(0,
					fileName.length() - 3) });
		}

		return result;
	}

	protected String fileName;

	protected String getInputFileName() {
		return String.format("%s.in", fileName);
	}

	protected String getOutputFileName() {
		return String.format("%s.out", fileName);
	}

	public AbstractTest(String fileName) {
		this.fileName = fileName;
	}

	@Test
	public void testSolver() {
		TestConfiguration config = getClass().getAnnotation(
				TestConfiguration.class);
		try {
			System.err.println(String.format("Testing with file %s", fileName));

			assertEquals(getExpectedOutput(), config.solverClass()
					.newInstance().solve(getInputFileName()));
		} catch (Exception e) {
			e.printStackTrace();
			fail();
		}
	}

	private String getExpectedOutput() throws Exception {
		StringBuilder result = new StringBuilder();

		char[] cbuf = new char[1024];
		Reader r = new BufferedReader(new InputStreamReader(getClass()
				.getClassLoader().getResourceAsStream(getOutputFileName())));
		int numRead = 0;
		while ((numRead = r.read(cbuf)) != -1) {
			result.append(String.valueOf(cbuf, 0, numRead));
		}

		r.close();

		return result.toString();
	}
}
