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("\n");
146         for(int j=1;j<=cnt2;j++)
147             printf("%d ",s2[j]);
148         printf("\n");
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",n-ans);
160     }
161     return 0;
162 }

 

posted @ 2017-03-28 19:02  BBBob  阅读(192)  评论(0编辑  收藏  举报