Advertisement
BaoJIaoPisu

Untitled

Nov 18th, 2022
621
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.47 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using ld = long double;
  7. using ull = unsigned long long;
  8.  
  9. using pii = pair<int, int>;
  10. using pll = pair<ll, ll>;
  11. using pld = pair<ld, ld>;
  12.  
  13. #define fi first
  14. #define se second
  15. #define left BAO
  16. #define right ANH
  17. #define pb push_back
  18. #define pf push_front
  19. #define mp make_pair
  20. #define ins insert
  21. #define btpc __builtin_popcount
  22. #define btclz __builtin_clz
  23.  
  24. #define sz(x) (int)(x.size());
  25. #define all(x) x.begin(), x.end()
  26. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  27.  
  28. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  29.  
  30. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  31. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  32. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  33.  
  34. template<class X, class Y>
  35.     bool minimize(X &x, const Y &y) {
  36.         if (x > y)
  37.         {
  38.             x = y;
  39.             return true;
  40.         }
  41.         return false;
  42.     }
  43. template<class X, class Y>
  44.     bool maximize(X &x, const Y &y) {
  45.         if (x < y)
  46.         {
  47.             x = y;
  48.             return true;
  49.         }
  50.         return false;
  51.     }
  52.  
  53. const int MOD = 1e9 + 7; //998244353
  54.  
  55. template<class X, class Y>
  56.     void add(X &x, const Y &y) {
  57.         x = (x + y);
  58.         if(x >= MOD) x -= MOD;
  59.     }
  60.  
  61. template<class X, class Y>
  62.     void sub(X &x, const Y &y) {
  63.         x = (x - y);
  64.         if(x < 0) x += MOD;
  65.     }
  66.  
  67. /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
  68.  
  69. const ll INF = 1e9;
  70. const int N = 1e5 + 10;
  71.  
  72. template <typename T> T mod_inv_in_range(T a, T m) {
  73.     // assert(0 <= a && a < m);
  74.     T x = a, y = m;
  75.     T vx = 1, vy = 0;
  76.     while (x) {
  77.         T k = y / x;
  78.         y %= x;
  79.         vy -= k * vx;
  80.         std::swap(x, y);
  81.         std::swap(vx, vy);
  82.     }
  83.     assert(y == 1);
  84.     return vy < 0 ? m + vy : vy;
  85. }
  86.  
  87. template <typename T> T mod_inv(T a, T m) {
  88.     a %= m;
  89.     a = a < 0 ? a + m : a;
  90.     return mod_inv_in_range(a, m);
  91. }
  92.  
  93. template <int MOD_> struct modnum {
  94.     static constexpr int MOD = MOD_;
  95.     static_assert(MOD_ > 0, "MOD must be positive");
  96.  
  97.     using ll = long long;
  98.  
  99.     int v;
  100.  
  101. public:
  102.  
  103.     modnum() : v(0) {}
  104.     modnum(ll v_) : v(int(v_ % MOD)) { if (v < 0) v += MOD; }
  105.     explicit operator int() const { return v; }
  106.     friend std::ostream& operator << (std::ostream& out, const modnum& n) { return out << int(n); }
  107.     friend std::istream& operator >> (std::istream& in, modnum& n) { ll v_; in >> v_; n = modnum(v_); return in; }
  108.  
  109.     friend bool operator == (const modnum& a, const modnum& b) { return a.v == b.v; }
  110.     friend bool operator != (const modnum& a, const modnum& b) { return a.v != b.v; }
  111.  
  112.     modnum inv() const {
  113.         modnum res;
  114.         res.v = mod_inv_in_range(v, MOD);
  115.         return res;
  116.     }
  117.     friend modnum inv(const modnum& m) { return m.inv(); }
  118.     modnum neg() const {
  119.         modnum res;
  120.         res.v = v ? MOD-v : 0;
  121.         return res;
  122.     }
  123.     friend modnum neg(const modnum& m) { return m.neg(); }
  124.  
  125.     modnum operator- () const {
  126.         return neg();
  127.     }
  128.     modnum operator+ () const {
  129.         return modnum(*this);
  130.     }
  131.  
  132.     modnum& operator ++ () {
  133.         v ++;
  134.         if (v == MOD) v = 0;
  135.         return *this;
  136.     }
  137.     modnum& operator -- () {
  138.         if (v == 0) v = MOD;
  139.         v --;
  140.         return *this;
  141.     }
  142.     modnum& operator += (const modnum& o) {
  143.         v -= MOD-o.v;
  144.         v = (v < 0) ? v + MOD : v;
  145.         return *this;
  146.     }
  147.     modnum& operator -= (const modnum& o) {
  148.         v -= o.v;
  149.         v = (v < 0) ? v + MOD : v;
  150.         return *this;
  151.     }
  152.     modnum& operator *= (const modnum& o) {
  153.         v = int(ll(v) * ll(o.v) % MOD);
  154.         return *this;
  155.     }
  156.     modnum& operator /= (const modnum& o) {
  157.         return *this *= o.inv();
  158.     }
  159.  
  160.     friend modnum operator ++ (modnum& a, int) { modnum r = a; ++a; return r; }
  161.     friend modnum operator -- (modnum& a, int) { modnum r = a; --a; return r; }
  162.     friend modnum operator + (const modnum& a, const modnum& b) { return modnum(a) += b; }
  163.     friend modnum operator - (const modnum& a, const modnum& b) { return modnum(a) -= b; }
  164.     friend modnum operator * (const modnum& a, const modnum& b) { return modnum(a) *= b; }
  165.     friend modnum operator / (const modnum& a, const modnum& b) { return modnum(a) /= b; }
  166. };
  167. using num = modnum<MOD>;
  168.  
  169. void BaoJiaoPisu() {
  170.     ll a, b, c; cin >> a >> b >> c;
  171.     a--; c--;
  172.    
  173.     //a > 1, c > 1, b ^ 2 < ac
  174.  
  175.     num ans = 0;
  176.     for(int _b = 1; _b <= b; _b++) {
  177.         int B = _b * _b;
  178.  
  179.         int div = 1, res = B;
  180.         vector<int> events;
  181.         while(res) {
  182.             events.pb(div);
  183.             div = B / res + 1;
  184.             res = B / div;
  185.         }
  186.  
  187.         events.pb(B + 1);
  188.         for(int i = 0; i + 1 < events.size(); i++) {
  189.             int l = events[i], r = events[i + 1] - 1;
  190.             minimize(r, a);
  191.             if(l > a) break;
  192.             ll t = min(c, 1ll * B / l);
  193.             num f = (r - l + 1); f *= t;
  194.             ans += f;  
  195.         }  
  196.     }
  197.  
  198.     num t = a; t *= b; t *= c;
  199.     ans = t - ans;
  200.     cout << ans;
  201. }
  202.  
  203. int main()
  204. {
  205.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  206.     #ifndef ONLINE_JUDGE
  207.     freopen("input.txt", "r", stdin);
  208.     freopen("output.txt", "w", stdout);
  209.     #else
  210.     //online
  211.     #endif
  212.  
  213.     int tc = 1, ddd = 0;
  214.     // cin >> tc;
  215.     while(tc--) {
  216.         //ddd++;
  217.         //cout << "Case #" << ddd << ": ";
  218.         BaoJiaoPisu();
  219.     }
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement