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 }