D. Points and Powers of Two

题意:找最长的序列,使得该序列的任意两个值的差是2的倍数. 输出长度,并输出元素

思路:

因此有结论:最长只有3,并且相邻的差只能是相同的2^k  枚举k,枚举求解最长长度

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
#define debug puts
#define setp cout << fixed << setprecision(15)
#define fst ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int MOD=998244373;
int a[N];
int ans[N];
map<int,int> mp;
int main(void){
    fst;
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        int t;
        cin >> a[i];
        mp[a[i]]=1;
    }
    sort(a+1,a+1+n);
    int mx=0;
    int index=1;
    for(int i=1;i<=n;i++){

        for(int j=0;j<=30;j++){
            ll t= 1ll<<j;
            int cnt=0;
            ans[++cnt]=a[i];
            ll te=a[i];
//    cout <<"t="<<t<<endl;
            while(1){
//                    cout <<"~"<<te<<endl;
                if(mp[te+t]){
                    ans[++cnt]=te+t;
                    te=te+t;
                }
                else break;
                if(cnt==3)  break;
            }
//            puts("******");
            mx=max(mx,cnt);
        }
    }


    for(int i=1;i<=n;i++){

        for(int j=0;j<=30;j++){
            ll t= 1ll<<j;
            int cnt=0;
            ans[++cnt]=a[i];
            ll te=a[i];
//    cout <<"t="<<t<<endl;
            while(1){
//                    cout <<"~"<<te<<endl;
// if(a[i]==3) cout <<"te="<<te<<endl;
                if(mp[te+t]){
                    ans[++cnt]=te+t;
                                        te=te+t;
                }
                else break;
                if(mx==cnt){
                    cout << mx << endl;
                    for(int i=1;i<=cnt;i++){
                        cout << ans[i]<<" ";
                    }
                    return 0;
                }
            }
        }
    }
    cout << mx << endl;
    if(mx==1)   cout << a[1]<<endl;
//    if(mx==0)   cout << a[0]<<endl;
    return 0;
}