結果
問題 | No.1276 3枚のカード |
ユーザー | SSRS |
提出日時 | 2020-10-30 22:44:54 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,215 ms / 2,000 ms |
コード長 | 1,648 bytes |
コンパイル時間 | 1,937 ms |
コンパイル使用メモリ | 173,636 KB |
実行使用メモリ | 11,108 KB |
最終ジャッジ日時 | 2024-07-22 02:20:15 |
合計ジャッジ時間 | 37,645 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 61 |
ソースコード
#include <bits/stdc++.h> using namespace std; const long long MOD = 1000000007; vector<pair<long long, pair<long long, long long>>> quotient_ranges(long long N){ vector<pair<long long, pair<long long, long long>>> ans; for (long long i = 1; i * i <= N; i++){ ans.push_back(make_pair(N / i, make_pair(i, i))); } for (long long i = N / ((long long) sqrt(N) + 1); i >= 1; i--){ ans.push_back(make_pair(i, make_pair(N / (i + 1) + 1, N / i))); } return ans; } long long factor_count_sum(long long N){ //d(1)+d(2)+...+d(N) vector<pair<long long, pair<long long, long long>>> Q = quotient_ranges(N); int cnt = Q.size(); long long ans = 0; for (int i = 0; i < cnt; i++){ ans += Q[i].first * (Q[i].second.second - Q[i].second.first + 1) % MOD; ans %= MOD; } return ans; } int main(){ long long N; cin >> N; long long F = factor_count_sum(N); long long ans1 = (F - N % MOD + MOD) % MOD * (N - 2) % MOD; vector<pair<long long, pair<long long, long long>>> Q = quotient_ranges(N); int cnt = Q.size(); long long ans2 = 0; for (int i = 0; i < cnt; i++){ long long a = Q[i].first; long long b = Q[i].second.second - Q[i].second.first + 1; long long c = (a - 1) % MOD * (a - 2) % MOD * 500000004 % MOD; ans2 += b * c % MOD; ans2 %= MOD; } ans2 *= 2; ans2 %= MOD; long long ans3 = 0; for (int i = 0; i < cnt; i++){ long long a = Q[i].first; long long b = Q[i].second.second - Q[i].second.first + 1; long long G = factor_count_sum(a) - a * 2 % MOD + 1 + MOD; G %= MOD; ans3 += b * G % MOD; ans3 %= MOD; } cout << (ans1 - ans2 - ans3 + MOD * 2) % MOD << endl; }