結果
問題 |
No.1627 三角形の成立
|
ユーザー |
![]() |
提出日時 | 2025-04-09 21:02:54 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,190 bytes |
コンパイル時間 | 203 ms |
コンパイル使用メモリ | 82,568 KB |
実行使用メモリ | 79,620 KB |
最終ジャッジ日時 | 2025-04-09 21:04:54 |
合計ジャッジ時間 | 3,081 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 6 WA * 16 |
ソースコード
MOD = 10**9 + 7 import sys from math import isqrt def compute_mobius(max_n): max_n += 1 mobius = [1] * max_n is_prime = [True] * max_n for p in range(2, max_n): if is_prime[p]: for multiple in range(p, max_n, p): is_prime[multiple] = False if multiple != p else is_prime[multiple] mobius[multiple] *= -1 p_square = p * p for multiple in range(p_square, max_n, p_square): mobius[multiple] = 0 return mobius def comb3(x): if x < 3: return 0 return x * (x-1) * (x-2) // 6 % MOD def main(): n, m = map(int, sys.stdin.readline().split()) total = n * m ans = comb3(total) if ans < 0: ans += MOD ans = (ans - n * comb3(m)) % MOD ans = (ans - m * comb3(n)) % MOD max_d = min(n-1, m-1) if max_d < 1: print(ans % MOD) return max_mn = max(n-1, m-1) mobius = compute_mobius(max_mn) diag = 0 for d in range(1, max_d + 1): A = (n - 1) // d B = (m - 1) // d if A == 0 or B == 0: continue current = 0 max_g = min(A, B) for g in range(1, max_g + 1): mu = mobius[g] if mu == 0: continue a = A // g b = B // g if a == 0 or b == 0: continue term1 = (a * b) % MOD term2 = (g * a * b * (b + 1) // 2) % MOD term3 = (g * b * a * (a + 1) // 2) % MOD term4 = (g * g * a * (a + 1) // 2 % MOD) * (b * (b + 1) // 2 % MOD) % MOD mn_term = (n * m) % MOD part1 = mn_term * term1 % MOD part2 = (d * m % MOD) * term2 % MOD part3 = (d * n % MOD) * term3 % MOD part4 = (d * d % MOD) * term4 % MOD total_term = (part1 - part2 - part3 + part4) * mu % MOD current = (current + total_term) % MOD current = current * 2 * (d - 1) % MOD diag = (diag + current) % MOD ans = (ans - diag) % MOD if ans < 0: ans += MOD print(ans) if __name__ == "__main__": main()