結果

問題 No.2249 GCDistance
ユーザー shakayamishakayami
提出日時 2023-03-17 22:31:41
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
TLE  
実行時間 -
コード長 1,784 bytes
コンパイル時間 583 ms
コンパイル使用メモリ 12,068 KB
実行使用メモリ 20,548 KB
最終ジャッジ日時 2023-10-18 15:27:07
合計ジャッジ時間 7,597 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 155 ms
20,548 KB
testcase_01 TLE -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

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**8)
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


'''
0