Advertisement
Guest User

Untitled

a guest
Jan 11th, 2016
4,706
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define forn(i, n) for (int i = 0; i < int(n); i++)
  4. #define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
  5. #define fore(i, l, r) for (int i = int(l); i < int(r); i++)
  6. #define correct(x, y, n, m) (0 <= (x) && (x) < (n) && 0 <= (y) && (y) < (m))
  7. #define all(a) (a).begin(), (a).end()
  8. #define sz(a) int((a).size())
  9. #define pb(a) push_back(a)
  10. #define mp(x, y) make_pair((x), (y))
  11. #define x first
  12. #define y second
  13.  
  14. using namespace std;
  15.  
  16. typedef long long li;
  17. typedef long double ld;
  18. typedef pair<int, int> pt;
  19.  
  20. template<typename X> inline X abs(const X& a) { return a < 0? -a: a; }
  21. template<typename X> inline X sqr(const X& a) { return a * a; }
  22.  
  23. const int INF = int(1e9);
  24. const li INF64 = li(1e18);
  25. const ld EPS = 1e-9, PI = 3.1415926535897932384626433832795;
  26.  
  27. li n, m;
  28.  
  29. inline bool read() {
  30.     return !!(cin >> n >> m);
  31. }
  32.  
  33. const li mod = INF + 7;
  34.  
  35. inline void normal(li& a) {
  36.     a %= mod;
  37.     (a < 0) && (a += mod);
  38. }
  39.  
  40. inline li mul(li a, li b) {
  41.     a %= mod, b %= mod;
  42.     normal(a), normal(b);
  43.     return (a * b) % mod;
  44. }
  45.  
  46. inline li add(li a, li b) {
  47.     a %= mod, b %= mod;
  48.     normal(a), normal(b);
  49.     return (a + b) % mod;
  50. }
  51.  
  52. inline li sub(li a, li b) {
  53.     a %= mod, b %= mod;
  54.     normal(a), normal(b);
  55.     a -= b;
  56.     normal(a);
  57.     return a;
  58. }
  59.  
  60. inline li sum(li n) { return mul(mul(n, n + 1), (mod + 1) / 2); }
  61. inline li sum(li lf, li rg) { return sub(sum(rg), sum(lf - 1)); }
  62.  
  63. inline li calcDiv(li n, li m) {
  64.     m = min(m, n);
  65.  
  66.     li ans = 0;
  67.     li minVal = m;
  68.     for (li i = 1; i * i <= n; i++) {
  69.         li lf = n / (i + 1), rg = n / i;
  70.         rg = min(rg, m);
  71.         if (lf >= rg) continue;
  72.         minVal = lf; // interval (lf, rg]
  73.         ans = add(ans, mul(i, sum(lf + 1, rg)));
  74.     }
  75.     fore(i, 1, minVal + 1) {
  76.         ans = add(ans, mul(n / i, i));
  77.     }
  78.     return ans;
  79. }
  80.  
  81. inline li calcMod(li n, li m) {
  82.     li ans = mul(n, m);
  83.     ans = sub(ans, calcDiv(n, m));
  84.     return ans;
  85. }
  86.  
  87. inline void solve() {
  88.     cout << calcMod(n, m) << endl;
  89. }
  90.  
  91. int main() {
  92. #ifdef SU1
  93.     assert(freopen("input.txt", "rt", stdin));
  94.     //assert(freopen("output.txt", "wt", stdout));
  95. #endif
  96.    
  97.     cout << setprecision(10) << fixed;
  98.     cerr << setprecision(5) << fixed;
  99.  
  100.     while (read()) {
  101.         solve();
  102.         //break;
  103.     }
  104.     cerr << clock() / ld(CLOCKS_PER_SEC) << endl;
  105.    
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement