結果
問題 | No.551 夏休みの思い出(2) |
ユーザー |
👑 ![]() |
提出日時 | 2020-09-01 02:29:27 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 344 ms / 4,000 ms |
コード長 | 4,080 bytes |
コンパイル時間 | 275 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 80,500 KB |
最終ジャッジ日時 | 2024-11-17 03:48:35 |
合計ジャッジ時間 | 10,032 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 47 |
ソースコード
class Modulo_Error(Exception):passclass Modulo():def __init__(self,a,n):self.a=a%nself.n=ndef __str__(self):return "{} (mod {})".format(self.a,self.n)#+,-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 __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 __sub__(self,other):return self+(-other)def __rsub__(self,other):if isinstance(other,int):return -self+other#乗法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)#Modulo逆数def inverse(self):return self.Modulo_Inverse()def Modulo_Inverse(self):x0, y0, x1, y1 = 1, 0, 0, 1a,b=self.a,self.nwhile b != 0:q, a, b = a // b, b, a % bx0, x1 = x1, x0 - q * x1y0, y1 = y1, y0 - q * y1if a!=1:raise Modulo_Error("{}の逆数が存在しません".format(self))else:return Modulo(x0,self.n)#除法def __truediv__(self,other):return self*(other.Modulo_Inverse())def __rtruediv__(self,other):return other*(self.Modulo_Inverse())#累乗def __pow__(self,m):u=abs(m)r=Modulo(1,self.n)while u>0:if u%2==1:r*=selfself*=selfu=u>>1if m>=0:return relse:return r.Modulo_Inverse()#ルジャンドル記号def Legendre(X):"""ルジャンドル記号(a/p)を返す.※法が素数のときのみ成立する."""if X==0:return 0elif X**((X.n-1)//2)==1:return 1else:return -1#根号def sqrt(X,All=False):"""X=a (mod p)のとき,r*r=a (mod p)を満たすrを返す.※法pが素数のときのみ有向※存在しないときはNoneが返り値"""if Legendre(X)==-1:return Nonefrom random import randint as riif X==0:return Xelif X.n==2:return Xelif X.n%4==3:return X**((X.n+1)//4)p=X.nu=2s=1while (p-1)%(2*u)==0:u*=2s+=1q=(p-1)//uz=Modulo(0,p)while z**((p-1)//2)!=-1:z=Modulo(ri(1,p-1),p)m,c,t,r=s,z**q,X**q,X**((q+1)//2)while m>1:if t**(2**(m-2))==1:c=c*cm=m-1else:c,t,r,m=c*c,c*c*t,c*r,m-1if All:return (r,-r)else:return r#================================================P,R=map(int,input().split())Q=int(input())X=[""]*Qfor i in range(Q):A,B,C=map(lambda x:Modulo(int(x),P),input().split())D=B*B-4*A*CL=Legendre(D)if L==0:X[i]=str((-B/(2*A)).a)elif L==1:T=sqrt(D)alpha=((-B+T)/(2*A)).abeta=((-B-T)/(2*A)).aif alpha>beta:alpha,beta=beta,alphaX[i]=" ".join(map(str,[alpha,beta]))else:X[i]="-1"print("\n".join(X))