結果
| 問題 |
No.1746 Sqrt Integer Segments
|
| ユーザー |
ygd.
|
| 提出日時 | 2021-11-19 23:56:00 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 880 ms / 2,000 ms |
| コード長 | 2,022 bytes |
| コンパイル時間 | 309 ms |
| コンパイル使用メモリ | 82,696 KB |
| 実行使用メモリ | 127,760 KB |
| 最終ジャッジ日時 | 2024-09-13 09:27:30 |
| 合計ジャッジ時間 | 16,125 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()))
MAX = pow(10,6)
PL,dummy = prime_list(MAX)
#素数 -> index
prime_idx = {}
for i,p in enumerate(PL):
prime_idx[p] = i
Z = []
zobrist_hash = 0
for _ in range(len(PL)):
#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 a in A:
P = prime_factorize(a)
for soin,jo in P:
if jo%2 == 0: continue #偶数なので不変
#print(key,val)
idx = prime_idx[soin]
zobrist_hash ^= Z[idx]
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)
def prime_factorize(n):
ret = []
cnt = 0
while n % 2 == 0:
cnt += 1
n //= 2
if cnt > 0:
ret.append((2,cnt))
i = 3
while i * i <= n:
cnt = 0
while n % i == 0:
cnt += 1
n //= i
else:
ret.append((i,cnt))
i += 2
if n != 1:
ret.append((n,1))
return ret #(素因数、何乗)
if __name__ == '__main__':
main()
ygd.