結果
問題 | 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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 123 ms
78,576 KB |
testcase_01 | TLE | - |
testcase_02 | -- | - |
testcase_03 | -- | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
ソースコード
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 '''