CodeForce 模板
输入输出加速
import os
import sys
from io import BytesIO, IOBase
from types import GeneratorType
BUFSIZE = 8192
class FastIO(IOBase):
newlines = 0
def __init__(self, file):
self._fd = file.fileno()
self.buffer = BytesIO()
self.writable = 'x' in file.mode or 'r' not in file.mode
self.write = self.buffer.write if self.writable else None
def read(self):
while True:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
if not b:
break
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines = 0
return self.buffer.read()
def readline(self):
while self.newlines == 0:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
self.newlines = b.count(b'\n') + (not b)
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines -= 1
return self.buffer.readline()
def flush(self):
if self.writable:
os.write(self._fd, self.buffer.getvalue())
self.buffer.truncate(0), self.buffer.seek(0)
class IOWrapper(IOBase):
def __init__(self, file):
self.buffer = FastIO(file)
self.flush = self.buffer.flush
self.writable = self.buffer.writable
self.write = lambda s: self.buffer.write(s.encode('ascii'))
self.read = lambda: self.buffer.read().decode('ascii')
self.readline = lambda: self.buffer.readline().decode('ascii')
# 使用快速输入输出,防止卡时间
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip('\r\n')
def int_get(): return int(input())
def ints_get(): return map(int, input().strip().split())
def list_get(): return list(map(int, sys.stdin.readline().strip().split()))
def chars_get(): return list(map(str, sys.stdin.readline().strip().split()))
I = lambda: int(input())
MI = lambda: map(int, input().split())
LI = lambda: list(map(int, input().split()))
数学
快速幂并取模,使用pow(x, y, mod)
组合数并取模
def comb(n, k, mod):
num = 1
for i in range(n - k + 1, n + 1):
num *= i
num %= mod
den = 1
for i in range(2, k + 1):
den *= i
den %= mod
res = num * pow(den, mod - 2, mod)
return res % mod
判断质数和分解质因子
lpf = list(range(n + 1))
for x in range(2, int(n ** .5) + 1):
if lpf[x] == x:
for y in range(x * x, n + 1, x):
lpf[y] = x
def is_prime(x):
return lpf[x]==x
def get_factors(x):
facs = set()
while x > 1:
p = lpf[x]
x //= p
facs.add(p)
return facs
最小公倍数
def lcm(a, b): return (a * b) // math.gcd(a, b)
递归深度更改和加速
def bootstrap(f, stack=[]):
def wrappedfunc(*args, **kwargs):
if stack:
return f(*args, **kwargs)
else:
to = f(*args, **kwargs)
while True:
if type(to) is GeneratorType:
stack.append(to)
to = next(to)
else:
stack.pop()
if not stack:
break
to = stack[-1].send(to)
return to
return wrappedfunc
并查集
def find(x):
cur = x
while x != fa[x]:
x = fa[x]
while fa[cur] != x:
fa[cur], cur = x, fa[cur]
return x
def find(x):
if x!=fa[x]:
fa[x] = find(fa[x])
return fa[x]