結果
問題 | No.1276 3枚のカード |
ユーザー |
![]() |
提出日時 | 2025-04-09 21:04:37 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 671 ms / 2,000 ms |
コード長 | 1,435 bytes |
コンパイル時間 | 462 ms |
コンパイル使用メモリ | 82,240 KB |
実行使用メモリ | 76,564 KB |
最終ジャッジ日時 | 2025-04-09 21:06:35 |
合計ジャッジ時間 | 22,628 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 61 |
ソースコード
MOD = 10**9 + 7 def sum_d(n): if n <= 0: return 0 m = int(n**0.5) res = 0 for i in range(1, m + 1): res += n // i res = 2 * res - m * m return res def main(): N = int(input().strip()) M = N // 2 if M < 1: print(0) return ans = 0 current_k = N // 2 # Start with the largest possible k while current_k >= 2: # Calculate the B range for current_k lower = (N // (current_k + 1)) + 1 upper = N // current_k # Adjust the valid B range L = max(lower, 2) R = min(upper, M) if L > R: current_k -= 1 continue cnt = R - L + 1 # Calculate term1: (k-1) * (N+1 -k) * cnt k = current_k term1 = (k - 1) * ((N + 1 - k) % MOD) % MOD term1 = term1 * cnt % MOD # Calculate term2: (k-1) * sum_d(B) from L to R sum_r = sum_d(R) sum_l_minus_1 = sum_d(L - 1) sum_d_B = (sum_r - sum_l_minus_1) % MOD term2 = (k - 1) * sum_d_B % MOD # Update the answer ans = (ans + term1 - term2) % MOD ans = (ans + MOD) % MOD # Ensure non-negative # Determine next_k to jump next_k = N // (R + 1) if (R + 1) <= N else 0 if next_k >= current_k: current_k -= 1 else: current_k = next_k print(ans % MOD) if __name__ == "__main__": main()