Advertisement
anechka_ne_plach

Untitled

Oct 12th, 2021
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 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 = 0; i <= max_c; ++i) {
  95.         goods.push_back(c_i[i]);
  96.     }
  97.     goods = poww(goods, k);
  98. //    for (int i = 0; i < goods.size(); ++i) {
  99. //        cout << goods[i] << "x^" << i << " ";
  100. //    }
  101. //    cout << "\n";
  102.     goods.resize(50002);
  103.     vector<long long> prefix;
  104.     int curr = 0;
  105.     for (int i = 0; i < goods.size(); ++i) {
  106.         curr += goods[i];
  107.         curr %= 786433;
  108.         prefix.push_back(curr);
  109.     }
  110. //    for (int i : prefix) {
  111. //        cout << i << " ";
  112. //    }
  113. //    cout << "\n";
  114. //    cout << q << "\n";
  115.     for (int i = 0; i < q; ++i) {
  116.         int l, r;
  117.         cin >> l >> r;
  118.         --l;
  119.         cout << (prefix[r] - prefix[l] + 786433) %  786433 << "\n";
  120.     }
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement