結果
問題 | No.1596 Distance Sum in 2D Plane |
ユーザー |
👑 ![]() |
提出日時 | 2021-07-09 21:39:40 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 625 ms / 2,000 ms |
コード長 | 5,573 bytes |
コンパイル時間 | 157 ms |
コンパイル使用メモリ | 82,156 KB |
実行使用メモリ | 182,300 KB |
最終ジャッジ日時 | 2024-07-01 15:35:10 |
合計ジャッジ時間 | 8,609 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
class Modulo_Error(Exception):passclass Modulo():__slots__=["a","n"]def __init__(self,a,n):self.a=a%nself.n=ndef __str__(self):return "{} (mod {})".format(self.a,self.n)def __repr__(self):return self.__str__()#+,-def __pos__(self):return selfdef __neg__(self):return Modulo(-self.a,self.n)#等号,不等号def __eq__(self,other):if isinstance(other,Modulo):return (self.a==other.a) and (self.n==other.n)elif isinstance(other,int):return (self-other).a==0def __neq__(self,other):return not(self==other)def __le__(self,other):a,p=self.a,self.nb,q=other.a,other.nreturn (a-b)%q==0 and p%q==0def __ge__(self,other):return other<=selfdef __lt__(self,other):return (self<=other) and (self!=other)def __gt__(self,other):return (self>=other) and (self!=other)def __contains__(self,val):return val%self.n==self.a#加法def __add__(self,other):if isinstance(other,Modulo):if self.n!=other.n:raise Modulo_Error("異なる法同士の演算です.")return Modulo(self.a+other.a,self.n)elif isinstance(other,int):return Modulo(self.a+other,self.n)def __radd__(self,other):if isinstance(other,int):return Modulo(self.a+other,self.n)def __iadd__(self,other):if isinstance(other,Modulo):if self.n!=other.n: raise Modulo_Error("異なる法同士の演算です.")self.a+=other.aif self.a>=self.n: self.a-=self.nelif isinstance(other,int):self.a+=otherif self.a>=self.n: self.a-=self.nreturn self#減法def __sub__(self,other):return self+(-other)def __rsub__(self,other):if isinstance(other,int):return -self+otherdef __isub__(self,other):if isinstance(other,Modulo):if self.n!=other.n: raise Modulo_Error("異なる法同士の演算です.")self.a-=other.aif self.a<0: self.a+=self.nelif isinstance(other,int):self.a-=otherif self.a<0: self.a+=self.nreturn self#乗法def __mul__(self,other):if isinstance(other,Modulo):if self.n!=other.n:raise Modulo_Error("異なる法同士の演算です.")return Modulo(self.a*other.a,self.n)elif isinstance(other,int):return Modulo(self.a*other,self.n)def __rmul__(self,other):if isinstance(other,int):return Modulo(self.a*other,self.n)def __imul__(self,other):if isinstance(other,Modulo):if self.n!=other.n: raise Modulo_Error("異なる法同士の演算です.")self.a*=other.aelif isinstance(other,int):self.a*=otherself.a%=self.nreturn self#Modulo逆数def inverse(self):return self.Modulo_Inverse()def Modulo_Inverse(self):s,t=1,0a,b=self.a,self.nwhile b:q,a,b=a//b,b,a%bs,t=t,s-q*tif a!=1:raise Modulo_Error("{}の逆数が存在しません".format(self))else:return Modulo(s,self.n)#除法def __truediv__(self,other):return self*(other.Modulo_Inverse())def __rtruediv__(self,other):return other*(self.Modulo_Inverse())#累乗def __pow__(self,other):if isinstance(other,int):u=abs(other)r=Modulo(pow(self.a,u,self.n),self.n)if other>=0:return relse:return r.Modulo_Inverse()else:b,n=other.a,other.nif pow(self.a,n,self.n)!=1:raise Modulo_Error("矛盾なく定義できません.")else:return self**bdef Factor_Modulo(N,M,Mode=0):"""Mode=0のとき:N! (mod M) を求める.Mode=1のとき:k! (mod M) (k=0,1,...,N) のリストも出力する.[計算量]O(N)"""if Mode==0:X=Modulo(1,M)for k in range(1,N+1):X*=kreturn Xelse:L=[Modulo(1,M)]*(N+1)for k in range(1,N+1):L[k]=k*L[k-1]return Ldef Factor_Modulo_with_Inverse(N,M):"""k=0,1,...,N に対する k! (mod M) と (k!)^(-1) (mod M) のリストを出力する.[入力]N,M:整数M>0[出力]長さ N+1 のリストのタプル (F,G):F[k]=k! (mod M), G[k]=(k!)^(-1) (mod M)[計算量]O(N)"""assert M>0F=Factor_Modulo(N,M,Mode=1)G=[0]*(N+1)G[-1]=F[-1].inverse()for k in range(N,0,-1):G[k-1]=k*G[k]return F,G#=================================================def nCr(n,r):return F[n]*G[r]*G[n-r]#=================================================import sysinput=sys.stdin.readlineN,M=map(int,input().split())Data=[]for _ in range(M):t,x,y=map(int,input().split())Data.append((t,x,y))#=== 全体を求めるMod=10**9+7F,G=Factor_Modulo_with_Inverse(2*N+1,Mod)X=(2*N)*nCr(2*N,N)#=== 寄与を引くfor t,x,y in Data:if t==1:xx=x+1; yy=yelse:xx=x; yy=y+1a=nCr(x+y,x)b=nCr(2*N-(xx+yy),N-xx)X-=nCr(x+y,x)*nCr(2*N-(xx+yy),N-xx)print(X.a)