結果
| 問題 |
No.1627 三角形の成立
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er