結果
| 問題 |
No.854 公平なりんご分配
|
| コンテスト | |
| ユーザー |
chaemon
|
| 提出日時 | 2019-07-26 23:28:38 |
| 言語 | Nim (2.2.0) |
| 結果 |
AC
|
| 実行時間 | 2,655 ms / 3,153 ms |
| コード長 | 2,591 bytes |
| コンパイル時間 | 4,375 ms |
| コンパイル使用メモリ | 71,744 KB |
| 実行使用メモリ | 141,092 KB |
| 最終ジャッジ日時 | 2024-07-02 09:58:02 |
| 合計ジャッジ時間 | 18,018 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 92 |
コンパイルメッセージ
/home/judge/data/code/Main.nim(2, 57) Warning: imported and not used: 'strutils' [UnusedImport] /home/judge/data/code/Main.nim(2, 45) Warning: imported and not used: 'math' [UnusedImport] /home/judge/data/code/Main.nim(2, 29) Warning: imported and not used: 'tables' [UnusedImport] /home/judge/data/code/Main.nim(2, 37) Warning: imported and not used: 'macros' [UnusedImport]
ソースコード
#{{{ header
import algorithm, sequtils, tables, macros, math, sets, strutils
when defined(MYDEBUG):
import header
proc scanf(formatstr: cstring){.header: "<stdio.h>", varargs.}
proc getchar(): char {.header: "<stdio.h>", varargs.}
proc nextInt(): int = scanf("%lld",addr result)
proc nextFloat(): float = scanf("%lf",addr result)
proc nextString(): string =
var get = false
result = ""
while true:
var c = getchar()
if int(c) > int(' '):
get = true
result.add(c)
else:
if get: break
get = false
template `max=`*(x,y:typed):void = x = max(x,y)
template `min=`*(x,y:typed):void = x = min(x,y)
template infty(T): untyped = ((T(1) shl T(sizeof(T)*8-2)) - 1)
#}}}
var pdiv: seq[int]
proc sieve_of_eratosthenes(n:int):void =
pdiv = newSeq[int](n)
for i in 2..<n:
pdiv[i] = i
for i in 2..<n:
if i * i >= n: break
if pdiv[i] == i:
for j in countup(i*i,n-1,i):
pdiv[j] = i
proc is_prime(n:int):bool =
return n!=1 and pdiv[n]==n
proc main():void =
sieve_of_eratosthenes(2000)
var
N = nextInt()
A = newSeqWith(N,nextInt())
pid = newSeq[int](2000)
zero_ct = newSeqWith(N+1,0)
ct = 0
for p in 2..<2000:
if pdiv[p]==p:
pid[p] = ct
ct += 1
var
t = newSeqWith(N+1,newSeq[int32](ct))
zero_ct[0] = 0
for i in 0..<N:
var a = A[i]
for j in 0..<ct:
t[i+1][j] = t[i][j]
zero_ct[i+1] = zero_ct[i]
if a == 0:
zero_ct[i+1] += 1
else:
for p in 2..a:
if p*p > a: break
while a mod p==0:
a = a div p
t[i+1][pid[p]] += 1
if a > 1:
t[i+1][pid[a]] += 1
var
Q = nextInt()
for _ in 0..<Q:
var
P = nextInt()
L = nextInt()
R = nextInt()
tt = newSeq[int32](ct)
u = newSeq[int](ct)
L -= 1
if zero_ct[R] - zero_ct[L] > 0:
echo "Yes"
else:
var valid = true
for j in 0..<ct:
tt[j] += t[R][j] - t[L][j]
var a = P
for p in 2..a:
if p*p > a: break
if a mod p == 0:
if p >= 2000:
valid = false
break
while a mod p == 0:
a = a div p
u[pid[p]] += 1
if not valid:
break
if not valid:
echo "NO"
continue
if a > 1:
if a >= 2000:
valid = false
echo "NO"
continue
else:
u[pid[a]] += 1
for i in 0..<ct:
if tt[i] < u[i]:
valid = false
if valid:
echo "Yes"
else:
echo "NO"
discard
main()
chaemon