Advertisement
Guest User

Grand Prix of Xi'an | H. King

a guest
Jan 3rd, 2020
482
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. /**
  2.  * code generated by JHelper
  3.  * More info: https://github.com/AlexeyDmitriev/JHelper
  4.  * @author marX
  5.  */
  6.  
  7. #include <iostream>
  8. #include <fstream>
  9.  
  10. #include <bits/stdc++.h>
  11.  
  12. using namespace std;
  13.  
  14. int check(vector<int> &a, int q, int p) {
  15.     unordered_map<int, int> tot;
  16.     int ans = 0, n = (int) a.size();
  17.  
  18.     for (int i = n - 1; i >= 0; --i) {
  19.         int u = 1LL * a[i] * q % p;
  20.  
  21.         int c = 0;
  22.  
  23.         if (tot.find(u) != tot.end()) {
  24.             c = tot[u];
  25.         }
  26.         tot[a[i]] = c + 1;
  27.         ans = max(ans, c + 1);
  28.     }
  29.  
  30.     if (ans * 2 >= n) {
  31.         return ans;
  32.     } else {
  33.         return -1;
  34.     }
  35. }
  36.  
  37. /// Modular exponentiation for integers
  38. long long mod_pow(long long val, long long n, long long mod) {
  39.     long long tar = 1;
  40.  
  41.     while (n) {
  42.         if (n & 1) {
  43.             tar = tar * val % mod;
  44.         }
  45.         n >>= 1;
  46.         val = val * val % mod;
  47.     }
  48.  
  49.     return tar;
  50. }
  51.  
  52. const int MAGIC = 22;
  53.  
  54. class H {
  55. public:
  56.     void solve(std::istream &in, std::ostream &out) {
  57.         int t;
  58.         in >> t;
  59.  
  60.         while (t--) {
  61.             int n, p;
  62.             in >> n >> p;
  63.  
  64.             vector<int> a(n), b(n);
  65.  
  66.             for (int i = 0; i < n; ++i) {
  67.                 in >> a[i];
  68.                 b[i] = mod_pow(a[i], p - 2, p);
  69.             }
  70.  
  71.             int answer = -1;
  72.  
  73.             if (a.size() > 2) {
  74.                 answer = max(answer, check(a, 1LL * a[2] * b[0] % p, p));
  75.             }
  76.  
  77.             if (a.size() > 3) {
  78.                 answer = max(answer, check(a, 1LL * a[3] * b[1] % p, p));
  79.             }
  80.  
  81.             map<int, int> freq;
  82.  
  83.             for (int i = 0; i + 1 < n; ++i) {
  84.                 freq[1LL * b[i] * a[i + 1] % p]++;
  85.             }
  86.  
  87.             for (int i = 0; i + 2 < n; ++i) {
  88.                 freq[1LL * b[i] * a[i + 2] % p]++;
  89.             }
  90.  
  91.             vector<pair<int, int>> rev_freq;
  92.  
  93.             for (auto p : freq) {
  94.                 rev_freq.push_back({p.second, p.first});
  95.             }
  96.  
  97.             sort(rev_freq.begin(), rev_freq.end());
  98.             reverse(rev_freq.begin(), rev_freq.end());
  99.  
  100.             for (int i = 0; i < min(MAGIC, (int) rev_freq.size()); ++i) {
  101.                 answer = max(answer, check(a, rev_freq[i].second, p));
  102.             }
  103.  
  104.             out << answer << '\n';
  105.         }
  106.     }
  107. };
  108.  
  109.  
  110. int main() {
  111.     H solver;
  112.     std::istream &in(std::cin);
  113.     std::ostream &out(std::cout);
  114.     solver.solve(in, out);
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement