#include <bits/stdc++.h>
using namespace std;
int n;
const int maxint=100005;
int a[maxint];
map < int,int > mp;
int po[105];
bool b[maxint];
void init_po(){
	memset(b,1,sizeof(b));
	cin >> n;
	for (int i=1;i<=n;i++){
		cin >> a[i];
		mp[a[i]]++;
	}
//	map < int,int > :: iterator ite;
//	for (ite=mp.begin();ite!=mp.end();ite++){
//		cout << ite->first << ' ' << ite->second << endl;
//	}
	sort(a+1,a+1+n);
	po[0]=1;
	for (int i=1;i<=100;i++) po[i]=po[i-1]*2;
//	for (int i=1;i<=10;i++) cout << po[i] << ' ';
//	cout << endl;
}
int have(int x){
	int ge;
//	cout << "x=" << x << endl;
	for (ge=1;ge<=100;ge++){
		if (po[ge]>x){
			break;
		}
	}
//	cout << "ge=" << ge << endl;
//	cout << "po=" << po[ge]-x << endl;
	if (mp.count(po[ge]-x)==0) return -1;
	int id=lower_bound(a+1,a+1+n,po[ge]-x)-a;
	if (!b[id]) return -1;
	return id;
}
void go(){
	init_po();
	int s=0;
	for (int i=n;i>=1;i--){
//		cout << "a=" << a[i] << endl;
		if (b[i] && mp[a[i]]>0){
			mp[a[i]]--;
			b[i]=false;
			int tmp=have(a[i]);
			if (tmp!=-1){
				b[tmp]=0;
				mp[a[tmp]]--;
				s++;
			}
		}
//		cout << "s=" << s << endl;
//		map < int,int > :: iterator ite;
//		for (ite=mp.begin();ite!=mp.end();ite++){
//			cout << ite->first << ' ' << ite->second << endl;
//		}
	}
	cout << s;
}
int main(){
	go();
	return 0;
}
/*
3
1 2 3
*/