编程之美 质数相关

题目3 : 质数相关

时间限制:
2000ms 单点时限:
1000ms 内存限制:
256MB

描述

两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数。一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关。如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关。现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小。

输入

第一行为一个数T,为数据组数。之后每组数据包含两行。

第一行为N,为集合S的大小。第二行为N个整数,表示集合内的数。

输出

对于每组数据输出一行,形如”Case #X: Y”。X为数据编号,从1开始,Y为最大的子集的大小。

数据范围

1 ≤ T ≤ 20

集合S内的数两两不同且范围在1到500000之间。

小数据

1 ≤ N ≤ 15

大数据

1 ≤ N ≤ 1000

样例输入

3
5
2 4 8 16 32
5
2 3 4 6 9
3
1 2 3

样例输出

Case #1: 3
Case #2: 3
Case #3: 2

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int n[1001];
int prime[500010];

bool isprime(int a)
{
    for(int i=2;i<=sqrt(a);i++)
        if(a%i==0) return false;
    return true;
}

bool can(vector<int> res, int t) {
    for(int i=0;i<res.size();i++) {
        if(res[i]/t >= 1) {
            if(res[i]%t != 0) continue;
            if(prime[res[i]/t]) //  p is prime
                return false;
        }else {
            if(t%res[i] != 0) continue;
            if(prime[t/res[i]])
                return false;
        }
    }
    return true;
}

int main() {
    //ifstream in("/Users/urey/data/input");
    int num,tmp,p=0;
    memset(prime,0,sizeof(p));
    for(int i=0;i<=500000;i++) {
        if(isprime(i)) prime[i]=1;
    }
    cin>>num;
    for(int i=0;i<num;i++) {
        int cases;
        cin>>cases;
        memset(n,0,sizeof(n));
        for(int j=1;j<=cases;j++) {
            cin>>tmp;
            n[j]=tmp;
        }
        vector<int> res;
        unsigned long maxSize = 0;
        for(int j=1;j<=cases;j++) {
            res.push_back(n[j]);
            for(int k=1;k<=cases;k++) {
                if(k == j) continue;
                if(can(res,n[k])) {
                    res.push_back(n[k]);
                }
            }
            if(res.size() > maxSize) {
                maxSize = res.size();
            }
            res.clear();
        }
        cout<<"Case #"<<i+1<<": "<<maxSize<<endl;
    }
    return 0;
}

    原文作者:qwurey
    原文地址: https://blog.csdn.net/yeruby/article/details/45275585
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞