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 }