http://acm.buaa.edu.cn/problem/431/
DP 分解质因数,复杂度O(10N)。100000以内的数的质数因子不超过10个。转化为记录质因数个数的最大值。

const int MM = 22222; const int PP = 100005; int N, ans; bool isp[PP]; int p[PP],cnt; int pt[PP],cc; int dp[PP]; int num[MM]; void get_p() { int i,j,k; memset(isp,true,sizeof(isp)); isp[0]=isp[1]=false; for(i=2;i<400;i++) { if(isp[i]) { for(j=i*i;j<PP;j+=i) isp[j]=false; } } cnt=0; for(i=2;i<PP;i++) if(isp[i]) p[cnt++]=i; } void get_data() { int i,j,k; scanf("%d",&N); for(i=0;i<N;i++) scanf("%d",&num[i]); } void gao(int x) { int i,j,k; cc=0; for(i=0;p[i]*p[i]<=x;i++) { if(x%p[i]==0) { pt[cc++]=p[i]; while(x%p[i]==0) x/=p[i]; } } if(x>1) pt[cc++]=x; int mx=-1; for(i=0;i<cc;i++) { dp[pt[i]]++; if(mx==-1||mx<dp[pt[i]]) mx=dp[pt[i]]; } for(i=0;i<cc;i++) dp[pt[i]]=f_max(mx,dp[pt[i]]); ans=f_max(ans,mx); } void solve() { int i,j,k; memset(dp,0,sizeof(dp)); ans=1; for(i=0;i<N;i++) gao(num[i]); printf("%d\n",ans); } int main() { get_p(); int ca; scanf("%d",&ca); while(ca--) get_data(),solve(); }