zoukankan      html  css  js  c++  java
  • BJFU 质数相关

      1 /*
      2  BJFU  质数相关
      3  http://101.200.220.237/contest/19/problem/116/
      4  二分图
      5  按质因数奇偶性建立二分图
      6  *
      7  *
      8  */
      9 #include <cstdio>
     10 #include <algorithm>
     11 #include <cstring>
     12 #include <cmath>
     13 #include <vector>
     14 #include <queue>
     15 //#define test
     16 using namespace std;
     17 const int Nmax=500005;
     18 int n;
     19 int num[Nmax];
     20 int s1[Nmax];
     21 int s2[Nmax];
     22 int cnt1;
     23 int cnt2;
     24 int match[Nmax];
     25 int book[Nmax];
     26 int is_prime[Nmax];
     27 int prime[Nmax];
     28 int prime_cnt;
     29 vector<int> v1[Nmax],v2[Nmax];
     30 int is(int n)
     31 {
     32     int ans=0;
     33     for(int i=1;i<=prime_cnt;i++)
     34     {
     35         if(prime[i]>n)
     36             break;
     37         if(n%prime[i]==0)
     38         {
     39             while(n%prime[i]==0)
     40             {
     41                 ans++;
     42                 n/=prime[i];
     43             }
     44         }
     45     }
     46 
     47     //if(is_prime[n])
     48         //return 1;
     49     //for(int i=2;i*i<=n;i++)
     50     //{
     51         //while(n%i==0)
     52         //{
     53             //ans++;
     54             //n/=i;
     55         //}
     56     //}
     57     return ans&1;
     58 }
     59 
     60 int dfs(int v)
     61 {
     62    for(int i=0;i<v1[v].size();i++)
     63    {
     64        int u=v1[v][i];
     65        if(book[u])
     66            continue;
     67        book[u]=1;
     68        if(match[u]==-1 || dfs(match[u]))
     69        {
     70            match[u]=v;
     71            return 1;
     72        }
     73    }
     74    return 0;
     75 }
     76 
     77 void init()
     78 {
     79     for(int i=1;i<=cnt1;i++)
     80         v1[i].clear();
     81     for(int i=1;i<=cnt2;i++)
     82         v2[i].clear();
     83     for(int i=1;i<=cnt1;i++)
     84     {
     85         for(int j=1;j<=cnt2;j++)
     86         {
     87             if(s1[i]%s2[j]==0 && is_prime[s1[i]/s2[j]])
     88             {
     89                 v1[i].push_back(j);
     90                 v2[j].push_back(i);
     91             }
     92             else if(s2[j]%s1[i]==0 && is_prime[s2[j]/s1[i]])
     93             {
     94                 v1[i].push_back(j);
     95                 v2[j].push_back(i);
     96             }
     97         }
     98     }
     99     for(int i=1;i<=cnt2;i++)
    100         match[i]=-1;
    101 }
    102 
    103 void get_prime()
    104 {
    105     for(int i=2;i<Nmax;i++)
    106         is_prime[i]=1;
    107     for(int i=2;i<Nmax;i++)
    108         if(is_prime[i])
    109         {
    110             prime[++prime_cnt]=i;
    111             for(int j=2;j*i<Nmax;j++)
    112                 is_prime[i*j]=0;
    113         }
    114 }
    115 
    116 int main()
    117 {
    118     #ifdef test
    119     freopen("6.test.in","r",stdin);
    120     #endif
    121     int t;
    122     scanf("%d",&t);
    123     get_prime();
    124     for(int ttt=1;ttt<=t;ttt++)
    125     {
    126         printf("Case #%d: ",ttt);
    127         scanf("%d",&n);
    128         cnt1=cnt2=0;
    129         for(int i=1;i<=n;i++)
    130         {
    131             scanf("%d",&num[i]);
    132             if(num[i]==1)
    133             {
    134                 s2[++cnt2]=num[i];
    135                 continue;
    136             }
    137             if(is(num[i]))
    138                 s1[++cnt1]=num[i];
    139             else
    140                 s2[++cnt2]=num[i];
    141         }
    142 #ifdef tesst
    143         for(int i=1;i<=cnt1;i++)
    144             printf("%d ",s1[i]);
    145         printf("
    ");
    146         for(int j=1;j<=cnt2;j++)
    147             printf("%d ",s2[j]);
    148         printf("
    ");
    149 #endif
    150         init();
    151         int ans=0;
    152         for(int i=1;i<=cnt1;i++)
    153         {
    154             for(int j=1;j<=cnt2;j++)
    155                 book[j]=0;
    156             if(dfs(i))
    157                 ans++;
    158         }
    159         printf("%d
    ",n-ans);
    160     }
    161     return 0;
    162 }
  • 相关阅读:
    centos6.3 配置防火墙,开启80端口、3306端口
    Unable to run man pages on Centos 6
    1. 信息系统基础知识
    2. 软件工程
    CommonJs
    软考资料
    Node.js资料
    qyqt5(一)
    tf源码中的object_detection_tutorial.ipynb文件
    分类结果的评价指标
  • 原文地址:https://www.cnblogs.com/BBBob/p/6636352.html
Copyright © 2011-2022 走看看