結果
| 問題 |
No.1746 Sqrt Integer Segments
|
| ユーザー |
ygd.
|
| 提出日時 | 2021-11-19 21:44:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,095 ms / 2,000 ms |
| コード長 | 2,034 bytes |
| コンパイル時間 | 273 ms |
| コンパイル使用メモリ | 82,356 KB |
| 実行使用メモリ | 246,636 KB |
| 最終ジャッジ日時 | 2024-09-13 09:27:56 |
| 合計ジャッジ時間 | 19,112 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 |
ソースコード
import sys
#input = sys.stdin.readline
input = sys.stdin.buffer.readline
from collections import defaultdict
import random
def prime_list(n):
is_prime = [0] * (n + 1) #素数かどうか。1なら素数。
is_prime[2] = 1
for i in range(3, n + 1, 2):
is_prime[i] = 1
for i in range(2, int(n ** 0.5) + 1):
if is_prime[i]:
for j in range(i * i, n + 1, 2 * i):
is_prime[j] = 0
#最後に全部並べる。
d = []
for j in range(n + 1):
if is_prime[j] == 1:
d.append(j)
return d, is_prime
def main():
n = int(input())
A = list(map(int,input().split()))
AS = set(A)
MAX = pow(10,6)
P,dummy = prime_list(MAX)
soinsu = [defaultdict(int) for _ in range(MAX+1)]
#prime_idx = {}
for i,p in enumerate(P):
v = p
#prime_idx[p] = i
while v <= MAX:
cnt = 0
if v not in AS: #入ってないので見る必要なし
v += p
continue
nv = v
while nv%p == 0:
nv //= p
cnt += 1
soinsu[v][i] = cnt%2 #i番目の素数の因数をいくつ持つか
v += p
#print(soinsu)
Z = []
zobrist_hash = 0
for _ in range(len(P)):
#long longの範囲でランダムにハッシュを取る
temp = random.randrange((1<<62) + 1,1<<63)
Z.append(temp)
zobrist_hash ^= temp
dic = defaultdict(int)
#ret = []
#ret.append(zobrist_hash)
dic[zobrist_hash] += 1
for i,a in enumerate(A):
#print("A",a)
for key,val in soinsu[a].items():
if val == 0: continue #偶数なので不変
#print(key,val)
zobrist_hash ^= Z[key]
dic[zobrist_hash] += 1
#ret.append(zobrist_hash)
#print(ret)
ans = 0
#print(dic)
for key,val in dic.items():
ans += val*(val-1)//2
print(ans)
if __name__ == '__main__':
main()
ygd.