Advertisement
anechka_ne_plach

Untitled

Oct 12th, 2021
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <memory>
  2. #include <cstddef>
  3. #include <iostream>
  4. #include <string>
  5. #include <complex>
  6. #include <vector>
  7. #include <cmath>
  8. #include <numbers>
  9.  
  10. using namespace std;
  11.  
  12. using base = complex<long double>;
  13.  
  14. void fft(vector<base>& a, bool invert) {
  15.     int n = a.size();
  16.  
  17.     for (int i = 1, j = 0; i < n; ++i) {
  18.         int bit = n >> 1;
  19.         for (; j >= bit; bit >>= 1) {
  20.             j -= bit;
  21.         }
  22.         j += bit;
  23.         if (i < j) {
  24.             swap(a[i], a[j]);
  25.         }
  26.     }
  27.  
  28.     for (int len=2; len<=n; len<<=1) {
  29.         long double ang = 2*numbers::pi/len * (invert ? -1 : 1);
  30.         base wlen (cos(ang), sin(ang));
  31.         for (int i = 0; i < n; i += len) {
  32.             base w(1);
  33.             for (int j = 0; j < len/2; ++j) {
  34.                 base u = a[i+j],  v = a[i+j+len/2] * w;
  35.                 a[i+j] = u + v;
  36.                 a[i+j+len/2] = u - v;
  37.                 w *= wlen;
  38.             }
  39.         }
  40.     }
  41.     if (invert) {
  42.         for (int i = 0; i < n; ++i) {
  43.             a[i] /= n;
  44.         }
  45.     }
  46. }
  47.  
  48. void multiply (const vector<long long>& a, const vector<long long>& b, vector<long long>& res) {
  49.     vector<base> fa(a.begin(), a.end()), fb(b.begin(), b.end());
  50.     int n = 1;
  51.     while (n < max(a.size(), b.size())) {
  52.         n <<= 1;
  53.     }
  54.     n <<= 1;
  55.     fa.resize(n), fb.resize(n);
  56.  
  57.     fft(fa, false), fft(fb, false);
  58.     for (int i = 0; i < n; ++i) {
  59.         fa[i] *= fb[i];
  60.     }
  61.     fft(fa, true);
  62.  
  63.     res.resize(min(n, int(5e4 + 1)));
  64.     for (int i = 0; i < res.size(); ++i) {
  65.         res[i] = (long long)(fa[i].real() + 0.5);
  66.     }
  67. }
  68.  
  69. vector<long long> poww(vector<long long>& a, int k) {
  70.     vector<long long> ans = {1};
  71.     while (k) {
  72.         if (k & 1) {
  73.             multiply(ans, a, ans);
  74.         }
  75.         multiply(a, a, a);
  76.         k >>= 1;
  77.     }
  78.     return ans;
  79. }
  80.  
  81. int c_i[50007];
  82.  
  83. int main() {
  84.     int n, k, q;
  85.     cin >> n >> k >> q;
  86.     vector<long long> goods;
  87.     int max_c = -1;
  88.     for (int i = 0; i < n; ++i) {
  89.         int c;
  90.         cin >> c;
  91.         c_i[c]++;
  92.         max_c = max(max_c, c);
  93.     }
  94.     for (int i = 1; i <= max_c; ++i) {
  95.         goods.push_back(c_i[i]);
  96.     }
  97.     std::reverse(goods.begin(), goods.end());
  98.     goods = poww(goods, k);
  99.     while(goods.size() > k * n) {
  100.         goods.pop_back();
  101.     }
  102. //    for (int i = 0; i < goods.size(); ++i) {
  103. //        cout << goods[i] << "x^" << goods.size() - i << " ";
  104. //    }
  105. //    cout << "\n";
  106.     vector<long long> prefix;
  107.     prefix.push_back(0);
  108.     int curr = 0;
  109.     for (int i = goods.size() - 1; i >= 0; --i) {
  110.         curr += goods[i];
  111.         curr %= 786433;
  112.         prefix.push_back(curr);
  113.     }
  114. //    for (int i : prefix) {
  115. //        cout << i << " ";
  116. //    }
  117. //    cout << "\n";
  118. //    cout << q << "\n";
  119.     for (int i = 0; i < q; ++i) {
  120.         int l, r;
  121.         cin >> l >> r;
  122.         r = min(r, (int)prefix.size() - 1);
  123.         --l;
  124.         cout << (prefix[r] - prefix[l] + 786433) %  786433 << "\n";
  125.     }
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement