Advertisement
Ikmik

rational

Oct 31st, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cstring>
  5. #include <string>
  6. #include <set>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. #include <deque>
  11. #include <algorithm>
  12. #include <sstream>
  13. #include <cstdlib>
  14. #include <cmath>
  15. #include <random>
  16. #include <bitset>
  17. #include <cassert>
  18. #include <tuple>
  19. #include <list>
  20. #include <iterator>
  21. #include <unordered_set>
  22. #include <unordered_map>
  23.  
  24. using namespace std;
  25.  
  26. typedef long long ll;
  27. typedef long double ld;
  28.  
  29. #define mp make_pair
  30. #define pb push_back
  31. #define mt make_tuple
  32.  
  33. #define forn(i, n) for (int i = 0; i < ((int)(n)); ++i)
  34. #define forrn(i, s, n) for (int i = (int)(s); i < ((int)(n)); ++i)
  35. #define all(v) (v).begin(), (v).end()
  36. #define rall(v) (v).rbegin(), (v).rend()
  37.  
  38. const int INF = 1791791791;
  39. const ll INFLL = 1791791791791791791ll;
  40.  
  41. const int maxq = 1e5 + 179;
  42.  
  43. ll gcd(ll a, ll b) {
  44.     while (b != 0)
  45.         tie(a, b) = mp(b, a % b);
  46.     return a;
  47. }
  48.  
  49. struct fraction {
  50.     ll p, q;
  51.     fraction() {}
  52.     fraction(ll _p, ll _q) {
  53.         p = _p;
  54.         q = _q;
  55.         ll g = gcd(p, q);
  56.         p /= g;
  57.         q /= g;
  58.     }
  59. };
  60.  
  61. ostream& operator<<(ostream& os, const fraction& f) {
  62.     os << f.p << "/" << f.q;
  63.     return os;
  64. }
  65.  
  66. mt19937 rnd(179);
  67.  
  68. ll q;
  69.  
  70. ll num(fraction l, fraction r, ll i) {
  71.     assert(l.p * r.q <= r.p * l.q);
  72.     return ((i * r.p) / r.q) - ((i * l.p + l.q - 1) / l.q) + 1;
  73. }
  74.  
  75. fraction random_in_range(fraction l, fraction r) {
  76.     ll total = 0;
  77.     for (ll i = 1; i <= q; i++) {
  78.         total += num(l, r, i);
  79.     }
  80.     auto start = [&](const ll& i) -> ll {
  81.         return (i * l.p + l.q - 1) / l.q;
  82.     };
  83.     ll rndval = rnd() % total;
  84.     for (ll i = 1; i < q; i++) {
  85.         if (rndval < num(l, r, i)) {
  86.             return fraction(start(i) + rand() % num(l, r, i), i);
  87.         }
  88.         rndval -= num(l, r, i);
  89.     }
  90.     return fraction(start(q) + rand() % num(l, r, q), q);
  91. }
  92.  
  93. vector<ll> divisors[maxq];
  94. int num_of_prime_factors[maxq];
  95.  
  96. ll stat_in_range(fraction mid, fraction l, __attribute__((unused)) fraction r) {
  97.     ll ans = 0;
  98.     for (ll i = 1; i <= q; i++) {
  99.         ll cans = 0;
  100.         for (ll t : divisors[i]) {
  101.             if ((num_of_prime_factors[t] % 2) == (num_of_prime_factors[i] % 2))
  102.                 cans += num(l, mid, t);
  103.             else
  104.                 cans -= num(l, mid, t);
  105.         }
  106.         ans += cans;
  107.     }
  108.     return ans;
  109. }
  110.  
  111. fraction solve(fraction l, fraction r, ll stat) {
  112.     while (true) {
  113.         fraction mid = random_in_range(l, r);
  114.         ll mid_stat = stat_in_range(mid, l, r);
  115.         if (mid_stat == stat)
  116.             return mid;
  117.         else if (mid_stat > stat)
  118.             r = mid;
  119.         else {
  120.             stat -= mid_stat - 1;
  121.             l = mid;
  122.         }
  123.     }
  124. }
  125.  
  126. bool is_prime[maxq];
  127. bool is_product_of_different_primes[maxq];
  128.  
  129. int main() {
  130.     // Code here:
  131.    
  132.     cin >> q;
  133.     memset(is_prime, 1, sizeof(is_prime));
  134.     is_prime[0] = is_prime[1] = false;
  135.     memset(num_of_prime_factors, 0, sizeof(num_of_prime_factors));
  136.     memset(is_product_of_different_primes, 1, sizeof(is_product_of_different_primes));
  137.     for (ll i = 2; i <= q; i++) {
  138.         if (is_prime[i]) {
  139.             num_of_prime_factors[i] = 1;
  140.             for (ll j = i + i; j <= q; j += i) {
  141.                 ll k = j;
  142.                 while (k % i == 0) {
  143.                     k /= i;
  144.                     num_of_prime_factors[j]++;
  145.                 }
  146.                 is_prime[j] = false;
  147.                 is_product_of_different_primes[j] &= ((j / i) % i != 0);
  148.             }
  149.         }
  150.     }
  151.  
  152.     for (ll i = 1; i <= q; i++) {
  153.         if (is_product_of_different_primes[i]) {
  154.             for (ll j = 1; i * j <= q; j++)
  155.                 divisors[i * j].pb(j);
  156.         }
  157.     }
  158.  
  159.     fraction l, r;
  160.     cin >> l.p >> l.q >> r.p >> r.q;
  161.  
  162.     ll stat;
  163.     cin >> stat;
  164.     cout << solve(l, r, stat) << endl;
  165.  
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement