package jp.funnything.competition.util;

import java.math.BigInteger;

/**
 * Utility for BigInteger
 */
public class BI {
    public static BigInteger ZERO = BigInteger.ZERO;
    public static BigInteger ONE = BigInteger.ONE;

    public static BigInteger add( final BigInteger x , final BigInteger y ) {
        return x.add( y );
    }

    public static BigInteger add( final BigInteger x , final long y ) {
        return add( x , v( y ) );
    }

    public static BigInteger add( final long x , final BigInteger y ) {
        return add( v( x ) , y );
    }

    public static int cmp( final BigInteger x , final BigInteger y ) {
        return x.compareTo( y );
    }

    public static int cmp( final BigInteger x , final long y ) {
        return cmp( x , v( y ) );
    }

    public static int cmp( final long x , final BigInteger y ) {
        return cmp( v( x ) , y );
    }

    public static BigInteger div( final BigInteger x , final BigInteger y ) {
        return x.divide( y );
    }

    public static BigInteger div( final BigInteger x , final long y ) {
        return div( x , v( y ) );
    }

    public static BigInteger div( final long x , final BigInteger y ) {
        return div( v( x ) , y );
    }

    public static BigInteger mod( final BigInteger x , final BigInteger y ) {
        return x.mod( y );
    }

    public static BigInteger mod( final BigInteger x , final long y ) {
        return mod( x , v( y ) );
    }

    public static BigInteger mod( final long x , final BigInteger y ) {
        return mod( v( x ) , y );
    }

    public static BigInteger mul( final BigInteger x , final BigInteger y ) {
        return x.multiply( y );
    }

    public static BigInteger mul( final BigInteger x , final long y ) {
        return mul( x , v( y ) );
    }

    public static BigInteger mul( final long x , final BigInteger y ) {
        return mul( v( x ) , y );
    }

    public static BigInteger sub( final BigInteger x , final BigInteger y ) {
        return x.subtract( y );
    }

    public static BigInteger sub( final BigInteger x , final long y ) {
        return sub( x , v( y ) );
    }

    public static BigInteger sub( final long x , final BigInteger y ) {
        return sub( v( x ) , y );
    }

    public static BigInteger v( final long value ) {
        return BigInteger.valueOf( value );
    }
}

import java.util.ArrayList;
import java.util.HashMap;

public class ProblemC {
	
	static ArrayList<Integer> allTheNumbers = new ArrayList<Integer>();
	static HashMap<Long, Long> binomCoeff = new HashMap<Long, Long>();
	
	public static int solveC(int A, int B)
	{
		allTheNumbers = new ArrayList<Integer>();
		int count = 0;
		String seeds[] = new String[B-A+1];
	//	System.out.println("SIZE OF ARRAY:" + seeds.length);
		for(int i = A, n = 0; n < seeds.length; i++, n++)
		{
			seeds[n] = Integer.toString(i);
			//System.out.println(seeds[n]);
		}
		
		
		for(int i = 0; i < seeds.length; i++)
		{
			count += binom(CircularStringShift(seeds[i], A, B),2);
		}
		
		return count;
	}
	public static int CircularStringShift(String s, int lowerLimit, int upperLimit)
	{
		String tmp = s;
		char placeHolder = ' ';
		int count = 0;
		int tmp2;
		
		for(int i = 0; i < s.length(); i++)
		{
			placeHolder = tmp.charAt(0);
			tmp = tmp.substring(1, tmp.length()) + placeHolder ;
			tmp2 = Integer.parseInt(tmp);
			if(!allTheNumbers.contains(tmp2) && tmp2 >= lowerLimit && tmp2 <= upperLimit && tmp != s)
			{
				count++;
				allTheNumbers.add(tmp2);
			}
					
		}
	
		
		
		return count;
	}
	
	static long binom(int n, int k) {
		
		if(binomCoeff.containsKey(n))
		{
			return binomCoeff.get(n);
		}
		
		long coeff = 1;
		for (int i = n - k + 1; i <= n; i++) {
			coeff *= i;
		}
		for (int i = 1; i <= k; i++) {
			coeff /= i;
		}
		binomCoeff.put((long)n, coeff);
		return coeff;
	}
 

}

