Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define task "SUMDIV"
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- using namespace std;
- using ll = long long;
- constexpr int N = 1e5 + 5;
- int l, r;
- vector<int> divisors;
- void Read()
- {
- cin >> l >> r;
- }
- void Sub_12()
- {
- for (; l <= r; ++l)
- for (int i = 1; i * i <= l; ++i)
- if (l % i == 0)
- {
- divisors.emplace_back(i);
- divisors.emplace_back(l / i);
- }
- sort(divisors.begin(), divisors.end());
- divisors.resize(unique(divisors.begin(), divisors.end()) - divisors.begin());
- ll ans(0);
- for (auto i : divisors)
- ans += i;
- cout << ans;
- }
- void Sub_3()
- {
- ll ans(0);
- for (int i = 1; i <= r; ++i)
- if ((l + i - 1) / i <= r / i)
- ans += i;
- cout << ans;
- }
- ll GetSum(ll l, ll r)
- {
- if (l > r)
- return 0;
- return (r - l + 1) * (r + l) / 2;
- }
- void Sub_4()
- {
- ll ans(0);
- vector<pair<int, int>> intervals;
- for (int i = 1; i * i <= r; ++i)
- if ((l + i - 1) / i <= r / i)
- {
- intervals.emplace_back(i, i);
- intervals.emplace_back((l + i - 1) / i, r / i);
- }
- sort(intervals.begin(), intervals.end());
- for (int i = 0, j = 0; i < (int)intervals.size(); ++i)
- {
- j = max(j, intervals[i].first);
- ans += GetSum(j, intervals[i].second);
- j = max(j, intervals[i].second + 1);
- }
- cout << ans;
- }
- int32_t main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- if (r <= 1000 || r - l <= 1000)
- Sub_12();
- else if (r <= 1e6)
- Sub_3();
- else
- Sub_4();
- }
Add Comment
Please, Sign In to add comment