using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography.X509Certificates; class Program { #region library static int n = 0; static int r = 0; static int c = 0; static string s = ""; static long sum = 0; static long cnt = 0; static long max = long.MinValue; static long min = long.MaxValue; static long inf = long.MaxValue / 2; static bool flg = false; static long[] arr; static char[,] map; static long[,] imap; static Queue qx = new Queue(); static Queue qy = new Queue(); static Queue qk = new Queue(); static int mod = 1000000007; static string alpha = "abcdefghijklmnopqrstuvwxyz"; public class Input { static readonly char[] separator = { ' ', '\r', '\n' }; readonly StreamReader sr; readonly Queue queue; public Input(string path = "") { queue = new Queue(); if (string.IsNullOrEmpty(path)) { sr = new StreamReader(Console.OpenStandardInput()); } else { sr = new StreamReader(path); } } public void SetText(IEnumerable items) { foreach (var item in items) { SetText(item); } } public bool SetText(string s) { if (s == null) return false; foreach (var elem in s.Trim() .Split(separator, StringSplitOptions.RemoveEmptyEntries)) { queue.Enqueue(elem); } return true; } public bool Any() { return queue.Any() || Read(); } bool Read() { if (!SetText(sr.ReadLine())) return false; if (!queue.Any()) return Read(); return queue.Any(); } public string Next() { if (!queue.Any() && !Read()) { return ""; } return queue.Dequeue(); } bool Accumulate(int n) { while (queue.Count() < n) { if (!Read()) return false; } return true; } public int NextInt() { return int.Parse(Next()); } public long NextLong() { return long.Parse(Next()); } public double NextDouble() { return double.Parse(Next()); } T[] NextT(int n, T offset, Func parse, Func add) { if (!Accumulate(n)) return null; var a = new T[n]; for (int i = 0; i < n; i++) a[i] = add(parse(queue.Dequeue()), offset); return a; } public string[] Next(int n) { return NextT(n, "", x => x, (x, y) => x); } public int[] NextInt(int n, int offset = 0) { return NextT(n, offset, int.Parse, (x, y) => x + y); } public long[] NextLong(int n, long offset = 0) { return NextT(n, offset, long.Parse, (x, y) => x + y); } public double[] NextDouble(int n, double offset = 0.0) { return NextT(n, offset, double.Parse, (x, y) => x + y); } } static Input input; static int Int() { return input.NextInt(); } static long Long() { return input.NextLong(); } static double Double() { return input.NextDouble(); } static string Text() { return input.Next(); } static void wl(object obj = null) { Console.WriteLine(obj); } static void w(object obj) { Console.Write(obj); } static void YES() { wl("YES"); } static void NO() { wl("NO"); } static void YN(bool b) { if (b) YES(); else NO(); } static void Yes() { wl("Yes"); } static void No() { wl("No"); } static void yn(bool b) { if (b) Yes(); else No(); } static void Sum() { wl(sum); } static void Cnt() { wl(cnt); } static void Max() { wl(max); } static void Min() { wl(min); } static void SetArray(long[] array = null) { if (array != null) { for (int i = 0; i < array.Length; i++) { array[i] = Long(); } } else { if (n == 0) { n = Int(); } arr = new long[n]; for (int i = 0; i < n; i++) { arr[i] = Long(); } } } static void ShowArray(long[] array = null) { if (array != null) { wl(string.Join(" ", array)); } else if (arr != null) { wl(string.Join(" ", arr)); } } static void CompressArray() { var list = arr.ToList(); list = list.OrderBy(x => x).ToList(); var dic = new Dictionary(); var cnt = 0; for (int i = 0; i < list.Count; i++) { if (!dic.ContainsKey(list[i])) { dic.Add(list[i], cnt); cnt++; } } var arr2 = new long[arr.Length]; for (int i = 0; i < arr.Length; i++) { arr2[i] = dic[arr[i]]; } arr = arr2; } static void SetMap(char[,] map2 = null) { if (r == 0 && c == 0) { r = Int(); c = Int(); } if (map2 != null) { for (int i = 0; i < r; i++) { s = Text(); for (int j = 0; j < c; j++) { map2[i, j] = s[j]; } } } else { map = new char[r, c]; for (int i = 0; i < r; i++) { s = Text(); for (int j = 0; j < c; j++) { map[i, j] = s[j]; } } } } static void RotateMap() { var map2 = new char[c, r]; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { map2[j, r - i - 1] = map[i, j]; } } map = map2; } static void SetIMap(long[,] imap2 = null) { if (r == 0 && c == 0) { r = Int(); c = Int(); } if (imap2 != null) { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { imap2[i, j] = Long(); } } } else { imap = new long[r, c]; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { imap[i, j] = Long(); } } } } static void ShowMap(char[,] map2 = null) { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (map2 != null) w(map2[i, j] + " "); else w(map[i, j] + " "); } wl(); } } static void ShowIMap(long[,] imap2 = null) { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (imap2 != null) w(imap2[i, j] + " "); else w(imap[i, j] + " "); } wl(); } } #endregion #region main static void Main(string[] args) { var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }; Console.SetOut(sw); input = new Input(); try { Solve(); } catch (Exception ex) { wl(ex); if (!(args.Length >= 1 && args[0] == "/debug")) throw ex; } Console.Out.Flush(); } public static void Solve() { var a = Int(); var b = Int(); wl(Factorial(a | b)); } static long Factorial(long n) { var ans = 1L; for (long i = 2; i <= n; i++) { ans *= i; } return ans; } #endregion }