結果
| 問題 |
No.2249 GCDistance
|
| コンテスト | |
| ユーザー |
shakayami
|
| 提出日時 | 2023-03-17 22:30:59 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,784 bytes |
| コンパイル時間 | 340 ms |
| コンパイル使用メモリ | 82,328 KB |
| 実行使用メモリ | 115,208 KB |
| 最終ジャッジ日時 | 2024-09-18 11:37:55 |
| 合計ジャッジ時間 | 7,266 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | TLE * 1 -- * 9 |
ソースコード
from heapq import heappush,heappop
from functools import lru_cache
import math
from math import gcd
N=10**7+100
K=N if N<10 else int((N/math.log(math.log(N)))**(2/3))
phi=[i for i in range(K+1)]
isPrime=[True for i in range(K+1)]
isPrime[0]=False;isPrime[1]=False
for i in range(K+1):
if isPrime[i]:
for j in range(2*i,K+1,i):
isPrime[j]=False
for j in range(i,K+1,i):
phi[j]-=phi[j]//i
Phi=[0 for i in range(K+1)]
for i in range(1,K+1):
Phi[i]=Phi[i-1]+phi[i]
@lru_cache(maxsize=10**6)
def solve(n):
tmp=n-1
if n<=K:
return Phi[n]
ans=(n*(n+1))//2
k=1
while(n//k>n//(k+1)):
tmp-=(n//k)-n//(k+1)
ans-=((n//k)-(n//(k+1)))*solve(k)
k+=1
i=2
while(tmp>0):
tmp-=1
ans-=solve(n//i)
i+=1
return ans
#[0, 1, -1, -1, 0, -1, 1, -1, 0, 0, 1, -1, 0, -1, 1, 1, 0, -1, 0, -1]
def solve_naive(N):
INF=10**18
ans=0
for st in range(1,N+1):
dist=[INF for i in range(N+1)]
dist[st]=0
q=[]
heappush(q,(0,st))
while(q):
nowdis,v=heappop(q)
if dist[v]<nowdis:
continue
for u in range(1,N+1):
w=gcd(u,v)
if dist[u]>dist[v]+w:
dist[u]=dist[v]+w
heappush(q,(dist[u],u))
for i in range(1,N+1):
ans+=dist[i]
#print(dist[1:])
return ans//2
def solve_ans(N):
res=solve(N)*2-1
ans=(2*N*N-res)
ans-=2*N-1
ans//=2
return ans
#for n in range(1,10):
# print(n,solve_naive(n),solve_ans(n))
#exit()
T=int(input())
for _ in range(T):
n=int(input())
print(solve_ans(n))
'''
iとjが互いに素なら1そうじゃないなら2
'''
shakayami