結果
問題 | No.2589 Prepare Integers |
ユーザー |
👑 |
提出日時 | 2023-12-17 23:52:10 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 276 ms / 2,000 ms |
コード長 | 2,471 bytes |
コンパイル時間 | 303 ms |
コンパイル使用メモリ | 82,816 KB |
実行使用メモリ | 80,156 KB |
最終ジャッジ日時 | 2024-09-27 08:11:48 |
合計ジャッジ時間 | 6,701 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 24 |
ソースコード
R=rangex=0def Expand( X , digit ):global xanswer=[]for d in R(digit):if x==0:breakif X[d]!=0:answer+=[x%X[d]]x//=X[d]else:answer+=[0]return answeru0=u1=v0=v1=0def PartitionOfUnity( b_0 , b_1 , K ):global u0 , u1 , v0 , v1a=[[1,0],[0,1]]b=[b_0,b_1]i_0=b_0<b_1i_1=1-i_0while b[i_1]!=0:q=b[i_0]//b[i_1]a[i_0][i_0]=(a[i_0][i_0]-q*a[i_1][i_0])%Ka[i_0][i_1]=(a[i_0][i_1]-q*a[i_1][i_1])%Kb[i_0]-=q*b[i_1]i_0,i_1=i_1,i_0u0,u1,v0,v1=a[i_0][0],a[i_0][1],a[i_1][0],a[i_1][1]return b[i_0]def SetGcd( gcd , gcd_inv , exp , K ):L=len(exp)-1if gcd_inv[L]==0:gcd[L][L]=PartitionOfUnity(K,exp[L],K)gcd_inv[L]=K//gcd[L][L]for d in R(L):gcd[L][d] , exp[d] = exp[d]*u1%K , exp[d]*gcd_inv[L]%Kelse:gcd[L][L]=PartitionOfUnity(gcd[L][L],exp[L],K)gcd_inv[L]=K//gcd[L][L]for d in R(L):gcd[L][d] , exp[d] = ( gcd[L][d] * u0 + exp[d] * u1 ) % K , ( gcd[L][d] * v0 + exp[d] * v1 ) % Kexp.pop()while len(exp) and exp[-1] == 0:exp.pop()if len(exp):SetGcd(gcd,gcd_inv,exp,K)O=printJ=lambda:map(int,input().split())K,Q=J()digit = 0K_vec=[]power = K*10**18while power > 0:power //= Kdigit+=1K_vec+=[K]gcd=[[0]*(d+1)for d in R(digit)]gcd_inv=[0]*digitfor q in R(Q):type,x=J()if type==1:exp=Expand(K_vec,digit)SetGcd( gcd , gcd_inv , exp , K )elif type == 2:if x == 1:O(0)continuex-=1exp = Expand( gcd_inv , digit )if x > 0:O( -1 )continueL=len(exp)-1coef=[0]*( L + 1 )for l in R(L,-1,-1):if gcd[l][l] != 0:exp[l] = (exp[l] - coef[l] // gcd[l][l])%Kfor d in R(l+1):coef[d] = ( coef[d] + exp[l] * gcd[l][d] ) % Kanswer = 0power = 1for d in R(L+1):answer += coef[d] * powerpower *= KO( answer )elif type == 3:if x == 0:O( 1 )continueexp = Expand( K_vec , digit )L = len(exp) - 1coef=[0]*( L + 1 )lb=[0]*( L + 1 )for l in R(L,-1,-1):if gcd[l][l] == 0:r = exp[l] - lb[l]if r < 0:breakif r > 0 or l==0:coef[l]=1breakelse:r = exp[l] - lb[l] % gcd[l][l]if r < 0:breakcoef[l] = r // gcd[l][l]r %=gcd[l][l]if r > 0:coef[l]+=1breakelif l==0:coef[l]+=1breakdiff = ( coef[l] - lb[l] // gcd[l][l] ) % Kfor d in R(l+1):lb[d] = ( lb[d] + diff * gcd[l][d] ) % Kanswer = 0prod = 1for d in R(L+1):answer += coef[d] * prodif gcd_inv[d] != 0:prod *= gcd_inv[d];O( answer )