Advertisement
BaoJIaoPisu

Untitled

Nov 18th, 2022
578
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.48 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 = 1e6 + 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. struct Query {
  170.     int n, k, id;
  171.  
  172.     bool operator < (const Query & temp) const {
  173.         return n < temp.n;
  174.     }
  175. } query[N];
  176. num f[N], invf[N];
  177. int prime[N], cnt[N];
  178. num res[N];
  179.  
  180. num power(num a, ll b) {
  181.     if(b == 0) return 1;
  182.     num ans = power(a, b / 2);
  183.     ans = ans * ans;
  184.     if(b & 1) ans = ans * a;
  185.     return ans;
  186. }
  187.  
  188.  
  189. void BaoJiaoPisu() {
  190.     int q; cin >> q;
  191.     for(int i = 1; i <= q; i++) {
  192.         cin >> query[i].n >> query[i].k;
  193.         query[i].id = i;
  194.     }
  195.  
  196.     sort(query + 1, query + 1 + q);
  197.     int iter = 0;
  198.  
  199.     int n = 1e6;
  200.  
  201.     for(int i = 2; i <= n; i++) prime[i] = i;
  202.     for(int i = 2; i <= n; i++) {
  203.         if(prime[i] == i) {
  204.             for(int j = i * 2; j <= n; j += i) prime[j] = i;
  205.         }
  206.     }
  207.  
  208.     f[0] = 1;
  209.     for(int i = 1; i <= n; i++) f[i] = f[i - 1] * i;
  210.     invf[n] = 1 / f[n];
  211.     for(int i = n - 1; i >= 0; i--) invf[i] = invf[i + 1] * (i + 1);
  212.  
  213.     auto C = [&](int n, int k) -> num {
  214.         if(n < k || k < 0) return 0;
  215.         return f[n] * invf[k] * invf[n - k];
  216.     };
  217.  
  218.     auto S = [&](int n, int k) -> num {
  219.         //Stirling number of the second kind
  220.         if(n < k || k < 0) return 0;
  221.         num ans = 0;
  222.         for(int i = 0; i <= k; i++) {
  223.             if(i & 1) ans -= C(k, i) * power(k - i, n);
  224.             else ans += C(k, i) * power(k - i, n);
  225.         }
  226.  
  227.         ans /= f[k];
  228.         return ans;
  229.     };
  230.  
  231.     int cp = 0;
  232.     num ans = 1;
  233.     for(int i = 1; i <= q; i++) {
  234.         while(iter < query[i].n) {
  235.             ++iter;
  236.             int x = iter;
  237.             while(x > 1) {
  238.                 int p = prime[x];
  239.                 if(cnt[p]) ans /= cnt[p];
  240.                 cnt[p]++;
  241.                 ans *= cnt[p];
  242.                 x /= p;
  243.             }
  244.  
  245.             if(prime[iter] == iter) ++cp;
  246.         }
  247.  
  248.         // cout << ans << endl;
  249.         // num t = 0;  
  250.         // for(int j = 1; j <= query[i].k; j++) t += S(cp, j);
  251.         res[query[i].id] += (S(cp, query[i].k) + S(cp, query[i].k - 1)) * ans;
  252.     }
  253.  
  254.     for(int i = 1; i <= q; i++) {
  255.         cout << res[i] << '\n';
  256.     }
  257. }
  258.  
  259. int main()
  260. {
  261.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  262.     #ifndef ONLINE_JUDGE
  263.     freopen("input.txt", "r", stdin);
  264.     freopen("output.txt", "w", stdout);
  265.     #else
  266.     //online
  267.     #endif
  268.  
  269.     int tc = 1, ddd = 0;
  270.     // cin >> tc;
  271.     while(tc--) {
  272.         //ddd++;
  273.         //cout << "Case #" << ddd << ": ";
  274.         BaoJiaoPisu();
  275.     }
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement