class Euler33 {

    private static class Options {
        boolean runCheckpoints = true;
    }

    private static boolean parseArguments(String[] args, Options options) {
        for (String arg : args) {
            if ("--skip-checkpoints".equals(arg)) {
                options.runCheckpoints = false;
            } else {
                System.err.println("Unknown argument: " + arg);
                return false;
            }
        }
        return true;
    }

    private static boolean isNontrivialDigitCanceling(int num, int den) {
        if (num >= den || num < 10 || den < 10) {
            return false;
        }

        int n1 = num / 10;
        int n2 = num % 10;
        int d1 = den / 10;
        int d2 = den % 10;

        if (n2 == 0 && d2 == 0) {
            return false;
        }

        java.util.function.BiPredicate<Integer, Integer> equivalent = (a, b) -> {
            if (b == 0) {
                return false;
            }
            return (long) num * b == (long) den * a;
        };

        if (n1 == d1 && n1 != 0 && equivalent.test(n2, d2)) {
            return true;
        }
        if (n1 == d2 && n1 != 0 && equivalent.test(n2, d1)) {
            return true;
        }
        if (n2 == d1 && n2 != 0 && equivalent.test(n1, d2)) {
            return true;
        }
        if (n2 == d2 && n2 != 0 && equivalent.test(n1, d1)) {
            return true;
        }

        return false;
    }

    private static int solve() {
        long productNum = 1;
        long productDen = 1;

        for (int num = 10; num < 100; num++) {
            for (int den = num + 1; den < 100; den++) {
                if (isNontrivialDigitCanceling(num, den)) {
                    productNum *= num;
                    productDen *= den;
                }
            }
        }

        long g = gcd(productNum, productDen);
        return (int) (productDen / g);
    }

    private static long gcd(long a, long b) {
        while (b != 0) {
            long temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    private static boolean runCheckpoints() {
        if (!isNontrivialDigitCanceling(49, 98)) {
            System.err.println("Checkpoint failed for 49/98");
            return false;
        }
        if (isNontrivialDigitCanceling(30, 50)) {
            System.err.println("Checkpoint failed for trivial cancellation");
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        Options options = new Options();
        if (!parseArguments(args, options)) {
            System.exit(1);
        }
        if (options.runCheckpoints && !runCheckpoints()) {
            System.exit(2);
        }
        System.out.println(solve());
    }
}
