class ModIntegerMeta(type):
def __new__(metacls, name, bases, members):
cls = super().__new__(metacls, name, bases, members)
for name in '__add__', '__sub__', '__mul__', '__neg__', '__repr__':
setattr(cls, name, cls.create_method(name))
return cls
def create_method(cls, name):
def method(self, *args):
value = getattr(self.value, name)(*(
arg.value if isinstance(arg, cls) else arg for arg in args
))
if type(value) is int:
return cls(value, self.mod)
return value
return method
class ModInteger(metaclass=ModIntegerMeta):
def __init__(self, value, mod):
self.mod = mod
self.value = value % mod
print((-ModInteger(66, 100) + ModInteger(39, 100) * 5))
Y2xhc3MgTW9kSW50ZWdlck1ldGEodHlwZSk6CiAgICBkZWYgX19uZXdfXyhtZXRhY2xzLCBuYW1lLCBiYXNlcywgbWVtYmVycyk6CiAgICAgICAgY2xzID0gc3VwZXIoKS5fX25ld19fKG1ldGFjbHMsIG5hbWUsIGJhc2VzLCBtZW1iZXJzKQogICAgICAgIGZvciBuYW1lIGluICdfX2FkZF9fJywgJ19fc3ViX18nLCAnX19tdWxfXycsICdfX25lZ19fJywgJ19fcmVwcl9fJzoKICAgICAgICAgICAgc2V0YXR0cihjbHMsIG5hbWUsIGNscy5jcmVhdGVfbWV0aG9kKG5hbWUpKQogICAgICAgIHJldHVybiBjbHMKCiAgICBkZWYgY3JlYXRlX21ldGhvZChjbHMsIG5hbWUpOgogICAgICAgIGRlZiBtZXRob2Qoc2VsZiwgKmFyZ3MpOgogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZi52YWx1ZSwgbmFtZSkoKigKICAgICAgICAgICAgICAgIGFyZy52YWx1ZSBpZiBpc2luc3RhbmNlKGFyZywgY2xzKSBlbHNlIGFyZyBmb3IgYXJnIGluIGFyZ3MKICAgICAgICAgICAgKSkKICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgaXMgaW50OgogICAgICAgICAgICAgICAgcmV0dXJuIGNscyh2YWx1ZSwgc2VsZi5tb2QpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgIHJldHVybiBtZXRob2QKCmNsYXNzIE1vZEludGVnZXIobWV0YWNsYXNzPU1vZEludGVnZXJNZXRhKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgbW9kKToKICAgICAgICBzZWxmLm1vZCA9IG1vZAogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZSAlIG1vZAoKcHJpbnQoKC1Nb2RJbnRlZ2VyKDY2LCAxMDApICsgTW9kSW50ZWdlcigzOSwgMTAwKSAqIDUpKQ==