math - shakayami/ACL-for-python GitHub Wiki
crt
中国剰余定理です。仕様は本家と同じです。入力のr,mはlistの形であって、len(r)=len(m)を要求します。返り値は(x,y)というtupleになっています。
注意:使用する際には、crtだけではなく、inv_gcd,inv_mod関数も同時にコピペしてください。
使用例
(https://atcoder.jp/contests/acl1/tasks/acl1_b)
def inv_gcd(a,b):
# (中略)
def inv_mod(x,m):
# (中略)
def crt(r,m):
#(中略)
N=int(input())
def divide(n):
res=[]
i=1
while(i*i<=n):
if n%i==0:
res.append(i)
if i*i!=n:
res.append(n//i)
i+=1
return res
ans=2*N
for b in divide(2*N):
c=(2*N)//b
tmp=crt([0,c-1],[b,c])
if tmp==(0,0):
continue
x=tmp[0]
if x==0:
x=tmp[1]
ans=min(x,ans)
print(ans)
floor-sum
sum_{i=0}^{n-1} floor((a*i+b)//m)を高速に求めるものです。
使用例
(https://atcoder.jp/contests/practice2/tasks/practice2_c)
def floor_sum(n,m,a,b):
#(中略)
T=int(input())
for i in range(T):
N,M,A,B=map(int,input().split())
print(floor_sum(N,M,A,B))