func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T1, typename T2>   inline bool chmin(T1 &a, T2 b) {     if (a > b) {       a = b;       return 1;     }     return 0;   }   template <typename T1, typename T2>   inline bool chmax(T1 &a, T2 b) {     if (a < b) {       a = b;       return 1;     }     return 0;   }   template <typename T>   T gcd(T a, T b) {     if (b == 0) return a;     return gcd(b, a % b);   }   template <typename T>   T lcm(T a, T b) {     return a / gcd(a, b) * b;   }   template <typename T>   T pow(T a, int b) {     return b ? pow(a * a, b / 2) * (b % 2 ? a : 1) : 1;   }   const int mod = 998244353;   long long modpow(long long a, int b) {     return b ? modpow(a * a % mod, b / 2) * (b % 2 ? a : 1) % mod : 1;   }   void solve();   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     int T;     T = 1;     while (T--) {       solve();     }   }   struct UnionFind {     vector<double> data;     int sz;     UnionFind(int _sz) : data(_sz, -1) { sz = _sz; }     bool connect(int x, int y) {       if ((x = root(x)) == (y = root(y))) return false;       if (data[x] > data[y]) swap(x, y);       data[x] += data[y];       data[y] = x;       sz--;       return true;     }     bool issame(int x, int y) { return root(x) == root(y); }     int root(int x) { return data[x] < 0 ? x : data[x] = root(data[x]); }     int size(int x) { return -data[root(x)]; }     int size() { return sz; }   };   void solve() {     int n;     cin >> n;     set<int> s;     for (int i = 0; i < (n); ++i) {       int b;       cin >> b;       s.insert(b);     }     vector<int> a;     for (auto e : s) a.emplace_back(e);     sort(a.begin(), a.end());     map<long long, int> mp;     for (int i = 0; i < (n); ++i) mp[a[i]] = i + 1;     for (int i = 0; i < (33); ++i) {       UnionFind uni(n);       for (int j = 0; j < (n - 1); ++j) {         long long num = a[j] + pow(2LL, i);         if (mp.count(num)) {           uni.connect(j, mp[num] - 1);         }       }       vector<vector<int> > v(n);       for (int j = 0; j < (n); ++j) {         v[uni.root(j)].emplace_back(a[j]);       }       for (int j = 0; j < (n); ++j) {         if ((int)v[j].size() >= 3) {           cout << 3 << endl;           for (int k = 0; k < (3); ++k) cout << v[j][k] <<    ;           cout << endl;           return;         }       }     }     for (int i = 0; i < (33); ++i) {       UnionFind uni(n);       for (int j = 0; j < (n - 1); ++j) {         long long num = a[j] + pow(2LL, i);         if (mp.count(num)) {           uni.connect(j, mp[num] - 1);         }       }       vector<vector<int> > v(n);       for (int j = 0; j < (n); ++j) {         v[uni.root(j)].emplace_back(a[j]);       }       for (int j = 0; j < (n); ++j) {         if ((int)v[j].size() >= 2) {           cout << 2 << endl;           for (int k = 0; k < (2); ++k) cout << v[j][k] <<    ;           cout << endl;           return;         }       }     }     cout << 1 << endl;     cout << a[0] << endl;   }   