GG选题

http://acm.buaa.edu.cn/problem/431/

DP 分解质因数,复杂度O(10N)。100000以内的数的质数因子不超过10个。转化为记录质因数个数的最大值。

View Code
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();
}

 

 

posted @ 2012-12-29 17:28  zhang1107  阅读(136)  评论(0编辑  收藏  举报