题意:找最长的序列,使得该序列的任意两个值的差是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;
}