zoukankan      html  css  js  c++  java
  • Prime Independence

    题意:

    对于给定集合,求解最大的子集合,使得集合内两两之商不为质数。

    解法:

    考虑对于每一个数字分解质因数可以得到 $O(nloglogNUM)$ 条两个数字不可以出现在同一集合的信息。

    同时发现一条代表冲突的边必然是联结一个由奇数个质数连乘构成的数字和一个由偶数个质数连乘构成的数字。

    是一个二分图,考虑最大独立集即可。

    #include <bits/stdc++.h>
    
    const int N = 100010;
    
    using namespace std;
    
    int n,timnow;
    int pre[N],a[N],v[N],cnt[N],Id[500010];
    vector<int> g[N],fac[N];
    
    bool find(int x)
    {
        for(int i=0;i<(int)g[x].size();i++)
        {
            int p = g[x][i];
            if(v[p] == timnow) continue;
            v[p] = timnow;
            if(!pre[p] || find(pre[p]))
            {
                pre[p] = x;
                return 1;
            }
        }
        return 0;
    }
    
    int main()
    {
        int T,Te = 0;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++) g[i].clear(),pre[i] = 0,fac[i].clear(),cnt[i]=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                Id[a[i]] = i;
                int tmp = a[i];
                for(int j=2;j*j<=a[i];j++)
                    if(tmp%j==0)
                    {
                        fac[i].push_back(j);
                        while(tmp%j==0) tmp/=j, cnt[i]++;
                    }
                if(tmp>1) fac[i].push_back(tmp), cnt[i]++;
            } 
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<(int)fac[i].size();j++)
                {
                    int tmp = a[i]/fac[i][j];
                    if(Id[tmp])
                    {
                        int k = Id[tmp];
                        if(cnt[i]&1) g[i].push_back(k);
                        else g[k].push_back(i);
                    }
                }
            }
            int ans = 0;
            for(int i=1;i<=n;i++)
            {
                timnow ++;
                if(find(i)) ans++;
                Id[a[i]] = 0;
            }
            printf("Case %d: %d
    ", ++Te, n-ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    使用浏览器的 Local Storage 真的安全吗?
    传统到敏捷的转型中,谁更适合做Scrum Master?
    HBM2E Flashbolt--提升人工智能的算力
    C语言 for 循环
    C语言自加自减运算符(++i / i++)
    C语言逗号表达式
    C语言逻辑运算符
    C语言三目运算符
    C语言条件判断 if / else
    C语言 printf 函数
  • 原文地址:https://www.cnblogs.com/lawyer/p/7128527.html
Copyright © 2011-2022 走看看