結果
| 問題 | 
                            No.2829 GCD Divination
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2024-09-25 02:49:58 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,283 bytes | 
| コンパイル時間 | 260 ms | 
| コンパイル使用メモリ | 81,904 KB | 
| 実行使用メモリ | 77,036 KB | 
| 最終ジャッジ日時 | 2024-09-25 02:50:02 | 
| 合計ジャッジ時間 | 3,912 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 7 WA * 28 | 
ソースコード
## 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)
    divisors.sort(reverse=True)
    # 各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:
                    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()