結果

問題 No.886 Direct
ユーザー lam6er
提出日時 2025-03-20 20:53:11
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 477 ms / 4,000 ms
コード長 1,492 bytes
コンパイル時間 234 ms
コンパイル使用メモリ 82,180 KB
実行使用メモリ 123,248 KB
最終ジャッジ日時 2025-03-20 20:53:45
合計ジャッジ時間 7,237 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 32
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

MOD = 10**9 + 7
def main():
H, W = map(int, input().split())
X = H - 1
Y = W - 1
if X < 0:
X = 0
if Y < 0:
Y = 0
max_d = max(X, Y) if X > 0 or Y > 0 else 0
mu = [1] * (max_d + 1) if max_d != 0 else []
is_prime = [True] * (max_d + 1) if max_d != 0 else []
if max_d >= 2:
for p in range(2, max_d + 1):
if is_prime[p]:
for multiple in range(p, max_d + 1, p):
is_prime[multiple] = False if multiple != p else is_prime[multiple]
mu[multiple] *= -1
p_square = p * p
for multiple in range(p_square, max_d + 1, p_square):
mu[multiple] = 0
horizontal = (H - 1) * W % MOD if H >= 1 else 0
vertical = H * (W - 1) % MOD if W >= 1 else 0
diagonal = 0
if X > 0 and Y > 0:
for d in range(1, X + 1):
if mu[d] == 0:
continue
m = Y // d
if m == 0:
continue
term_d = mu[d] * ((Y + 1) * m - d * m * (m + 1) // 2)
term_d %= MOD
k_max = X // d
sum_k = ( (X + 1) * k_max - d * k_max * (k_max + 1) // 2 ) % MOD
contribution = (term_d * sum_k) % MOD
diagonal = (diagonal + contribution) % MOD
diagonal = (2 * diagonal) % MOD
ans = (horizontal + vertical + diagonal) % MOD
print(ans)
if __name__ == "__main__":
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0