結果
問題 | No.1627 三角形の成立 |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:55:14 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 235 ms / 1,000 ms |
コード長 | 2,272 bytes |
コンパイル時間 | 182 ms |
コンパイル使用メモリ | 82,600 KB |
実行使用メモリ | 81,008 KB |
最終ジャッジ日時 | 2025-03-26 15:56:05 |
合計ジャッジ時間 | 3,645 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
MOD = 10**9 + 7inv2 = pow(2, MOD - 2, MOD)def compute_mobius(max_d):max_d += 1is_prime = [True] * max_dmu = [1] * max_dmin_prime = [0] * max_dfor i in range(2, max_d):if is_prime[i]:min_prime[i] = ifor j in range(i, max_d, i):is_prime[j] = Falseif min_prime[j] == 0:min_prime[j] = ifor i in range(2, max_d):if i == 1:continuep = min_prime[i]if p == 0:continuecnt = 0tmp = iwhile tmp % p == 0:tmp //= pcnt += 1if cnt >= 2:mu[i] = 0else:mu[i] = -mu[tmp]return mun, m = map(int, input().split())def comb(k):if k < 3:return 0return k * (k - 1) * (k - 2) // 6 % MODtotal = comb(n * m)horiz = (n * comb(m)) % MODvert = (m * comb(n)) % MODG = min(n - 1, m - 1) if (n >= 1 and m >= 1) else 0max_mobius = max(n, m) if G == 0 else max((n - 1) // 1, (m - 1) // 1)mu = compute_mobius(max_mobius)c_diag = 0for g in range(1, G + 1):d_max = min((m - 1) // g, (n - 1) // g)if d_max < 1:continueS_g = 0for d in range(1, d_max + 1):mud = mu[d]if mud == 0:continuegd = g * dA = (m - 1) // gdB = (n - 1) // gdsum_a_part1 = (m % MOD) * (A % MOD) % MODsum_a_part2 = (gd % MOD) * (A % MOD) % MODsum_a_part2 = sum_a_part2 * ((A + 1) % MOD) % MODsum_a_part2 = sum_a_part2 * inv2 % MODsum_a = (sum_a_part1 - sum_a_part2) % MODsum_b_part1 = (n % MOD) * (B % MOD) % MODsum_b_part2 = (gd % MOD) * (B % MOD) % MODsum_b_part2 = sum_b_part2 * ((B + 1) % MOD) % MODsum_b_part2 = sum_b_part2 * inv2 % MODsum_b = (sum_b_part1 - sum_b_part2) % MODterm = mud * sum_a % MODterm = term * sum_b % MODS_g = (S_g + term) % MODcontribution = (g - 1) * S_g % MODcontribution = contribution * 2 % MODc_diag = (c_diag + contribution) % MODcollinear = (horiz + vert + c_diag) % MODans = (total - collinear) % MODprint(ans if ans >= 0 else ans + MOD)