結果

問題 No.854 公平なりんご分配
ユーザー aaaaaaaaaa2230
提出日時 2022-05-21 23:09:01
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,386 bytes
コンパイル時間 444 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 88,076 KB
最終ジャッジ日時 2024-09-20 12:11:54
合計ジャッジ時間 17,020 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 50 TLE * 1 -- * 41
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input = sys.stdin.readline
n = int(input())
A = list(map(int,input().split()))
q = int(input())
P = []
LR = []
for i in range(q):
    p,l,r = map(int,input().split())
    P.append(p)
    LR.append([l-1,r])

M = 2*10**3+5
count = [0]*M
primes = []
for i in range(2,M):
    if count[i]:
        continue
    primes.append(i)
    for j in range(i,M,i):
        count[j] += 1

ans = [0]*q
zero = [0]*(n+1)
for i,a in enumerate(A,1):
    zero[i] = zero[i-1]+int(a==0)

ind = []
for i in range(q):
    p = P[i]
    l,r = LR[i]
    if zero[r]-zero[l]:
        ans[i] = 1
        continue
    np = p
    for p in primes:
        while np%p == 0:
            np //= p
    if np == 1:
        ind.append(i)
    # for j,p in enumerate(primes):
    #     accum[i][j] = accum[i-1][j]
    #     while a%p == 0:
    #         a //= p
    #         accum[i][j] += 1

accum = [0]*(n+1)
for p in primes:
    for i,a in enumerate(A,1):
        accum[i] = accum[i-1]
        while a%p == 0:
            accum[i] += 1
            a //= p
    
    nind = []
    for i in ind:
        np = P[i]
        l,r = LR[i]
        num = accum[r]-accum[l]
        while num and np%p == 0:
            num -= 1
            np //= p
        
        if np == 1:
            ans[i] = 1
            continue
        P[i] = np
        nind.append(i)

    ind = nind

for i in ans:
    print("Yes" if i else "NO")
0