Advertisement
anechka_ne_plach

Untitled

Oct 12th, 2021
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 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. const int mod = 786433;
  13. const int root = 5;
  14. const int root_1 = 471860;
  15. const int root_pw = 1<<18;
  16.  
  17. long long q_pow(long long a, int k) {
  18.     long long ans = 1;
  19.     while (k) {
  20.         if (k & 1) {
  21.             ans *= a;
  22.             ans %= mod;
  23.         }
  24.         a *= a;
  25.         a %= mod;
  26.         k >>= 1;
  27.     }
  28.     ans %= mod;
  29.     return ans;
  30. }
  31.  
  32. void fft (vector<long long> & a, bool invert) {
  33.     int n = (int) a.size();
  34.  
  35.     for (int i=1, j=0; i<n; ++i) {
  36.         int bit = n >> 1;
  37.         for (; j>=bit; bit>>=1)
  38.             j -= bit;
  39.         j += bit;
  40.         if (i < j)
  41.             swap (a[i], a[j]);
  42.     }
  43.  
  44.     for (int len=2; len<=n; len<<=1) {
  45.         int wlen = invert ? root_1 : root;
  46.         for (int i=len; i<root_pw; i<<=1)
  47.             wlen = int (wlen * 1ll * wlen % mod);
  48.         for (int i=0; i<n; i+=len) {
  49.             int w = 1;
  50.             for (int j=0; j<len/2; ++j) {
  51.                 int u = a[i+j],  v = int (a[i+j+len/2] * 1ll * w % mod);
  52.                 a[i+j] = u+v < mod ? u+v : u+v-mod;
  53.                 a[i+j+len/2] = u-v >= 0 ? u-v : u-v+mod;
  54.                 w = int (w * 1ll * wlen % mod);
  55.             }
  56.         }
  57.     }
  58.     if (invert) {
  59.         long long nrev = q_pow(n, mod - 2);
  60.         for (int i=0; i<n; ++i)
  61.             a[i] = int (a[i] * 1ll * nrev % mod);
  62.     }
  63. }
  64.  
  65. void multiply (const vector<long long>& a, const vector<long long>& b, vector<long long>& res) {
  66.     vector<long long> fa(a.begin(), a.end()), fb(b.begin(), b.end());
  67.     int n = 1;
  68.     while (n < max(a.size(), b.size())) {
  69.         n <<= 1;
  70.     }
  71.     n <<= 1;
  72.     fa.resize(n), fb.resize(n);
  73.  
  74.     fft(fa, false), fft(fb, false);
  75.     for (int i = 0; i < n; ++i) {
  76.         fa[i] *= fb[i];
  77.     }
  78.     fft(fa, true);
  79.  
  80.     res.resize(min(n, int(5e4 + 1)));
  81.     for (int i = 0; i < res.size(); ++i) {
  82.         res[i] = (long long)(fa[i]) % 786433;
  83.     }
  84. }
  85.  
  86. vector<long long> poww(vector<long long>& a, int k) {
  87.     vector<long long> ans = {1};
  88.     while (k) {
  89.         if (k & 1) {
  90.             multiply(ans, a, ans);
  91.         }
  92.         multiply(a, a, a);
  93.         k >>= 1;
  94.     }
  95.     return ans;
  96. }
  97.  
  98. int c_i[50007];
  99.  
  100. int main() {
  101.     int n, k, q;
  102.     cin >> n >> k >> q;
  103.     vector<long long> goods;
  104.     int max_c = -1;
  105.     for (int i = 0; i < n; ++i) {
  106.         int c;
  107.         cin >> c;
  108.         c_i[c]++;
  109.         max_c = max(max_c, c);
  110.     }
  111.     for (int i = 0; i <= max_c; ++i) {
  112.         goods.push_back(c_i[i]);
  113.     }
  114.     goods = poww(goods, k);
  115. //    for (int i = 0; i < goods.size(); ++i) {
  116. //        cout << goods[i] << "x^" << i << " ";
  117. //    }
  118. //    cout << "\n";
  119.     goods.resize(50002);
  120.     vector<long long> prefix;
  121.     int curr = 0;
  122.     for (int i = 0; i < goods.size(); ++i) {
  123.         curr += goods[i];
  124.         curr %= 786433;
  125.         prefix.push_back(curr);
  126.     }
  127. //    for (int i : prefix) {
  128. //        cout << i << " ";
  129. //    }
  130. //    cout << "\n";
  131. //    cout << q << "\n";
  132.     for (int i = 0; i < q; ++i) {
  133.         int l, r;
  134.         cin >> l >> r;
  135.         --l;
  136.         cout << (prefix[r] - prefix[l] + 786433) %  786433 << "\n";
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement