結果
| 問題 | No.2929 Miracle Branch | 
| コンテスト | |
| ユーザー | 👑 | 
| 提出日時 | 2024-07-18 01:16:16 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                WA
                                 
                            (最新) 
                                AC
                                 
                            (最初) | 
| 実行時間 | - | 
| コード長 | 1,118 bytes | 
| コンパイル時間 | 197 ms | 
| コンパイル使用メモリ | 82,128 KB | 
| 実行使用メモリ | 108,496 KB | 
| 最終ジャッジ日時 | 2024-08-25 23:41:55 | 
| 合計ジャッジ時間 | 10,402 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 41 WA * 2 | 
ソースコード
from collections import defaultdict
def factorint(n):
    factor = defaultdict(int)
    for p in range(2, min(n, 2 * 10**5) + 1):
        while n % p == 0:
            factor[p] += 1
            n //= p
    
    if n == 1:
        return factor
    else:
        print(-1)
        exit()
N = int(input())
if N == 1:
    print(2)
    print(1, 2)
    print("g", "b")
    exit()
factor = factorint(N)
factor[4] = factor[2] // 2
factor[2] %= 2
green = []
brown = []
edges = []
cnt = 0
def add_cnt():
    global cnt
    cnt += 1
    if cnt >= 2 * 10**5:
        print(-1)
        exit()
for p, x in factor.items():
    for _ in range(x):
        if cnt > 0:
            edges.append((brown[-1], cnt))
            
        brown.append(cnt)
        add_cnt()
        
        for _ in range(p):
            green.append(cnt)
            edges.append((brown[-1], cnt))
            add_cnt()
assert len(edges) + 1 < 2 * 10**5
print(len(edges) + 1)
for u, v in edges:
    print(u + 1, v + 1)
colors = [None] * (len(edges) + 1)
for g in green:
    colors[g] = "g"
for b in brown:
    colors[b] = "b"
print(*colors)
            
            
            
        