Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/python-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.7, 3.8]
python-version: [3.6, 3.7, 3.8]

steps:
- uses: actions/checkout@v2
Expand Down
2 changes: 0 additions & 2 deletions atcoder/maxflow.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from typing import NamedTuple, Optional, List, cast


Expand Down
2 changes: 0 additions & 2 deletions atcoder/mincostflow.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from __future__ import annotations

from typing import NamedTuple, Optional, List, Tuple, cast
from heapq import heappush, heappop

Expand Down
29 changes: 14 additions & 15 deletions atcoder/modint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from __future__ import annotations
import typing

import atcoder._math
Expand Down Expand Up @@ -38,7 +37,7 @@ def mod(self) -> int:
def val(self) -> int:
return self._v

def __iadd__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __iadd__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
self._v += rhs._v
else:
Expand All @@ -47,7 +46,7 @@ def __iadd__(self, rhs: typing.Union[Modint, int]) -> Modint:
self._v -= self._mod
return self

def __isub__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __isub__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
self._v -= rhs._v
else:
Expand All @@ -56,40 +55,40 @@ def __isub__(self, rhs: typing.Union[Modint, int]) -> Modint:
self._v += self._mod
return self

def __imul__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __imul__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
self._v = self._v * rhs._v % self._mod
else:
self._v = self._v * rhs % self._mod
return self

def __ifloordiv__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __ifloordiv__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
inv = rhs.inv()._v
else:
inv = atcoder._math._inv_gcd(rhs, self._mod)[1]
self._v = self._v * inv % self._mod
return self

def __pos__(self) -> Modint:
def __pos__(self) -> 'Modint':
return self

def __neg__(self) -> Modint:
def __neg__(self) -> 'Modint':
return Modint() - self

def __pow__(self, n: int) -> Modint:
def __pow__(self, n: int) -> 'Modint':
assert 0 <= n

return Modint(pow(self._v, n, self._mod))

def inv(self) -> Modint:
def inv(self) -> 'Modint':
eg = atcoder._math._inv_gcd(self._v, self._mod)

assert eg[0] == 1

return Modint(eg[1])

def __add__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __add__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
result = self._v + rhs._v
if result >= self._mod:
Expand All @@ -98,7 +97,7 @@ def __add__(self, rhs: typing.Union[Modint, int]) -> Modint:
else:
return Modint(self._v + rhs)

def __sub__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __sub__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
result = self._v - rhs._v
if result < 0:
Expand All @@ -107,26 +106,26 @@ def __sub__(self, rhs: typing.Union[Modint, int]) -> Modint:
else:
return Modint(self._v - rhs)

def __mul__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __mul__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
return Modint(self._v * rhs._v)
else:
return Modint(self._v * rhs)

def __floordiv__(self, rhs: typing.Union[Modint, int]) -> Modint:
def __floordiv__(self, rhs: typing.Union['Modint', int]) -> 'Modint':
if isinstance(rhs, Modint):
inv = rhs.inv()._v
else:
inv = atcoder._math._inv_gcd(rhs, self._mod)[1]
return Modint(self._v * inv)

def __eq__(self, rhs: typing.Union[Modint, int]) -> bool: # type: ignore
def __eq__(self, rhs: typing.Union['Modint', int]) -> bool: # type: ignore
if isinstance(rhs, Modint):
return self._v == rhs._v
else:
return self._v == rhs

def __ne__(self, rhs: typing.Union[Modint, int]) -> bool: # type: ignore
def __ne__(self, rhs: typing.Union['Modint', int]) -> bool: # type: ignore
if isinstance(rhs, Modint):
return self._v != rhs._v
else:
Expand Down