public class Sample115 {
	public enum Operator {
		Plus {
			@Override public String toString() { return "+"; }
			@Override public int calc(int lhs, int rhs) { return lhs + rhs; }
		},
		Minus {
			@Override public String toString() { return "-"; }
			@Override public int calc(int lhs, int rhs) { return lhs - rhs; }
		},
		Times {
			@Override public String toString() { return "*"; }
			@Override public int calc(int lhs, int rhs) { return lhs * rhs; }
		},
		Divide {
			@Override public String toString() { return "/"; }
			@Override public int calc(int lhs, int rhs) { return lhs / rhs; }
			@Override public int operate(int lhs, int rhs, int mod) {
				System.out.format("%d %s %d = ", lhs, toString(), rhs);
				int l = modulo(lhs, mod);
				int r = modulo(rhs, mod);
				if (lhs != l || rhs != r) {
					System.out.format("%d %s %d = ", l, toString(), r);
				}
				int ret = 0;
				for (int index = 0; index < mod; index++) {
					if (l == modulo(r * index, mod)) {
						ret = index;
						break;
					}
				}
				System.out.println(ret);
				return ret;
			}
		};

		public abstract int calc(int lhs, int rhs);
		public int operate(int lhs, int rhs, int mod) {
			System.out.format("%d %s %d = ", lhs, toString(), rhs);
			int l = modulo(lhs, mod);
			int r = modulo(rhs, mod);
			if (lhs != l || rhs != r) {
				System.out.format("%d %s %d = ", l, toString(), r);
			}
			int ret = modulo(calc(l, r), mod);
			System.out.println(ret);
			return ret;
		}
		protected int modulo(int val, int mod) {
			int ret = val;
			while (ret < 0) { ret += mod; }
			while (ret >= mod) { ret -= mod; }
			return ret;
		}
	}

	public static int calcModulo(Operator op, int lhs, int rhs, int mod) {
		return op.operate(lhs, rhs, mod);
	}


	public static void main(String[] args) {
		calcModulo(Operator.Plus, 1, 2, 10);
		calcModulo(Operator.Plus, 1, 2, 3);
		calcModulo(Operator.Plus, 7, 3, 10);
		calcModulo(Operator.Plus, 11, 12, 10);
		calcModulo(Operator.Minus, 3, 2, 10);
		calcModulo(Operator.Minus, 2, 3, 10);
		calcModulo(Operator.Times, 2, 3, 10);
		calcModulo(Operator.Times, 11, 12, 10);
		calcModulo(Operator.Times, 18, 39, 10);
		calcModulo(Operator.Divide, 1, 2, 11);
		calcModulo(Operator.Divide, 2, 18, 11);
	}
}
