记录编号 162241 评测结果 AAAAAAAAAA
题目名称 最长数列 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 2.413 s
提交时间 2015-05-15 17:46:30 内存使用 0.32 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>

#define LL long long
#define ULL long long
#define ipos set<LL>::iterator
#define N 210
#define eps 1e-13

using namespace std;

void file(){
	freopen("series.in","r",stdin);
	freopen("series.out","w",stdout);
}

int n,tot,ans=0;
multiset<LL> T;
multiset<ULL> Tu;
LL a[N];
ULL au[N];
map<LL,int> C;
map<ULL,int> Cu;

int _check1(ULL a1,ULL a2){
	int tmp=2;
	ULL d=a2-a1,now=a2;
	Cu.clear();
	for(int i=1;i<=n;i++) Cu[au[i]]++;
	Cu[now]--;
	while(Cu[now+d]){
		now+=d;
		if(now>0x7fffffff) break;
		Cu[now]--;
		tmp++;
	}
	return 0x7fffffff;
}

int _check2(ULL a1,ULL a2){
	int tmp=2;
	ULL d=a2/a1,now=a2;
	Cu.clear();
	for(int i=1;i<=n;i++) Cu[au[i]]++;
	Cu[now]--;
	while(Cu[now*d]){
		now*=d;
		if(now>0x7fffffff) break;
		Cu[now]--;
		tmp++;
	}
	return 0x7fffffff;
}

ULL _qpow(ULL x,int n){
	ULL ans=1;
	for(;n;n>>=1,x*=x) if(n&1) ans*=x;
	return ans;
}

int _check3(ULL now,int k){
	int tmp=1;
	Cu.clear();
	for(int i=1;i<=n;i++) Cu[au[i]]++;
	Cu[now]--;
	while(Cu[_qpow(now,k)]){
		LL tmp=now;
		now=_qpow(now,k);
		if(tmp>0&&now<tmp) break;
		Cu[now]--;
		tmp++;
	}
	return 0x7fffffff;
}

int check1(LL a1,LL a2){
	int tmp=2;
	LL d=a2-a1,now=a2;
	C.clear();
	for(int i=1;i<=n;i++) C[a[i]]++;
	C[now]--;
	C[a1]--;
	while(C[now+d]){
		now+=d;
		C[now]--;
		tmp++;
	}
	return tmp;
}

int check2(LL a1,LL a2){
	int tmp=2;
	LL d=a2/a1,now=a2;
	C.clear();
	for(int i=1;i<=n;i++) C[a[i]]++;
	C[now]--;
	C[a1]--;
//	if(a1=-a2) cout<<now;
	while(C[now*d]){
		now*=d;
	//	if(a1=-a2) cout<<' '<<now;
		C[now]--;
		tmp++;
	}
//	cout<<endl;
//	if(tmp==3) cout<<"check2 "<<a1<<' '<<a2<<endl;
	return tmp;
}

LL qpow(LL x,int n){
	LL ans=1;
	for(int i=1;i<=n;i++) ans*=x;
//	if(x==-3&&n==3) cout<<"ans = "<<C[ans]<<endl;
	return ans;
}

int check3(LL now,int k){
	int tmp=1;
	C.clear();
	for(int i=1;i<=n;i++) C[a[i]]++;
	C[now]--;
	//if(now==-3&&k==3) cout<<now<<' ';
	while(C[qpow(now,k)]){
		LL temp=now;
		now=qpow(now,k);
		if(temp>0&&now<temp){
			//cout<<"ov\n";
		/*	goto Die;*/break;
		}
	//	if(now==-3&&k==3) cout<<' '<<now;
		C[now]--;
		tmp++;
	}
//	Die:;
//	if(now==-3&&k==3) cout<<endl;
	return tmp;
}

int Te;

int main(){
	file();
	scanf("%d",&Te);
	while(scanf("%d",&n)==1){
		T.clear(); tot=0; ans=0;
		for(int i=1;i<=n;i++){
			LL x;
			scanf("%lld",&x);
			T.insert(x);
		}
		for(ipos i=T.begin();i!=T.end();i++) a[++tot]=(*i);
		n=tot;
		for(int i=1;i<=n;i++) au[i]=(ULL)a[i];
		for(int i=1;i<n;i++){
			for(int j=i+1;j<=n;j++){
				ans=max(ans,min(check1(a[i],a[j]),_check1(au[i],au[j])));
				if(a[i] && a[j]%a[i]==0)
					ans=max(ans,min(check2(a[i],a[j]),_check2(au[i],au[j])));
			}
		}
		for(int i=n;i>=2;i--){
			for(int j=1;j<i;j++){
				ans=max(ans,min(check1(a[i],a[j]),_check1(au[i],au[j])));
				if(a[i] && a[j]%a[i]==0)
					ans=max(ans,min(check2(a[i],a[j]),_check2(au[i],au[j])));
			}
		}
		for(int i=1;i<=n;i++)
			for(int k=0;k<=32;k++){
				ans=max(ans,check3(a[i],k));
			}
		printf("%d\n",ans);
	}
	return 0;
}