結果
| 問題 | 
                            No.2829 GCD Divination
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2024-09-25 03:01:51 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 211 ms / 2,000 ms | 
| コード長 | 1,271 bytes | 
| コンパイル時間 | 253 ms | 
| コンパイル使用メモリ | 82,188 KB | 
| 実行使用メモリ | 77,412 KB | 
| 最終ジャッジ日時 | 2024-09-25 03:01:56 | 
| 合計ジャッジ時間 | 3,480 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 35 | 
ソースコード
## https://yukicoder.me/problems/no/2829
import math
def main():
    N = int(input())
    # 約数の列挙
    sqrt_n = int(math.sqrt(N))
    divisors = []
    for p in range(1, sqrt_n + 1):
        if N % p == 0:
            q = N // p
            divisors.append(p)
            if q != p:
                divisors.append(q)
    # 各divisorたちのgcdとその分布を計算
    divisors.sort()
    gcds = []
    for i in range(len(divisors)):
        d = divisors[i]
        a_map = {}
        for j in reversed(range(i + 1)):
            d_ = divisors[j]
            if d % d_ > 0:
                continue
            
            q = d // d_
            for k in range(j + 1, i + 1):
                if d % divisors[k] == 0 and divisors[k] % d_ == 0:
                    q -= a_map[divisors[k]]
            a_map[d_] = q
        gcds.append(a_map)
    dp = {1:0}
    for i in range(len(divisors)):
        s = divisors[i]
        if s == 1:
            continue
        ans = s
        for key, value in gcds[i].items():
            if key == s:
                continue
            ans += value * dp[key]
        ans /= s - 1
        dp[s] = ans
    print(dp[N])
                
    
        
if __name__ == "__main__":
    main()