Advertisement
pasholnahuy

арифметическая закупа

May 31st, 2023
896
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <random>
  5. #include <algorithm>
  6. #pragma GCC optimize("Ofast,fast-math,unroll-loops,no-stack-protector,inline")
  7. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,avx,avx2,abm,mmx,popcnt")
  8.  
  9. using int64 = int;
  10. using namespace std;
  11.  
  12.  
  13. bool bs(vector<int64> &vec, int64 el) {
  14.     int64 l = 0, r = vec.size();
  15.     while (r - l > 1) {
  16.         int64 m = (l + r) / 2;
  17.         if (vec[m] > el) {
  18.             r = m;
  19.         } else {
  20.             l = m;
  21.         }
  22.     }
  23.     return vec[l] == el;
  24. }
  25.  
  26. pair<int64, int64> Check(int64 a, int64 d, vector<int64> &vec) {
  27.     int64 cnt = 1;
  28.     int64 minim = a;
  29.     while (minim - d >= vec[0] && bs(vec, minim - d)) {
  30.         ++cnt;
  31.         minim -= d;
  32.         if (cnt == vec.size()/2){
  33.             break;
  34.         }
  35.     }
  36.     if (cnt < vec.size()/2){
  37.         int64 maxi = a;
  38.         while (maxi + d <= vec.back() && bs(vec, maxi + d)) {
  39.             ++cnt;
  40.             if (cnt == vec.size()/2){
  41.                 break;
  42.             }
  43.             maxi += d;
  44.         }
  45.     }
  46.     return {cnt, minim};
  47. }
  48.  
  49. mt19937 generator;
  50.  
  51. int main() {
  52.     ios_base::sync_with_stdio(false);
  53.     cin.tie(nullptr);
  54.  
  55.     int64 n;
  56.     cin >> n;
  57.     vector<int64> vec(2 * n);
  58.     map<int64, int64> counter;
  59.     for (int64 i = 0; i < 2 * n; ++i) {
  60.         cin >> vec[i];
  61.         ++counter[vec[i]];
  62.         if (counter[vec[i]] >= n) {
  63.             cout << vec[i] << " 0" << "\n";
  64.             return 0;
  65.         }
  66.     }
  67.     sort(vec.begin(), vec.end());
  68.  
  69.     if (n == 1) {
  70.         cout << vec[0] << " 0" "\n";
  71.         return 0;
  72.     }
  73.     bool flag_odd = true;
  74.     for (int64 i = 3; i < 2 * n - 2; i += 2) {
  75.         if (vec[i] - vec[i - 2] != vec[i+2] - vec[i]){
  76.             flag_odd = false;
  77.             break;
  78.         }
  79.     }
  80.     if (flag_odd){
  81.         cout << vec[1] << " " << vec[3] - vec[1];
  82.         return 0;
  83.     }
  84.     bool flag_even = true;
  85.     for (int64 i = 2; i < 2 * n - 2; i += 2) {
  86.         if (vec[i] - vec[i - 2] != vec[i+2] - vec[i]){
  87.             flag_even= false;
  88.             break;
  89.         }
  90.     }
  91.     if (flag_even){
  92.         cout << vec[0] << " " << vec[2] - vec[0];
  93.         return 0;
  94.     }
  95.     while (true) {
  96.         int64 l = (generator() % (2 * n) + 2 * n) % (2 * n);
  97.         int64 r = (generator() % (2 * n) + 2 * n) % (2 * n);
  98.  
  99.         if (l >= r) continue;
  100.         int64 diff = vec[r] - vec[l];
  101.  
  102.         for (int64 k = 1; k * k <= diff; ++k) {
  103.             if (diff % k != 0) continue;
  104.  
  105.             auto [cnt, minim] = Check(vec[l], k, vec);
  106.             if (cnt == n) {
  107.                 cout << minim << " " << k;
  108.                 return 0;
  109.             }
  110.             if (k * k == diff) continue;
  111.             auto [cnt_2, minim_2] = Check(vec[l], n/k, vec);
  112.             if (cnt_2 == n) {
  113.                 cout << minim_2 << " " << n / k;
  114.                 return 0;
  115.             }
  116.         }
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement