转化为求最大独立集
#include<bits/stdc++.h>
#define Mem(a,b) memset(a,b,sizeof(a))
#define lson root<<1
#define rson root<<1|1
#define Mid int mid=(l+r)>>1
#define FREI freopen("in.txt","r",stdin)
#define N 500100
#define ll long long
#define eps 1e-6
#define Maxn 1010
using namespace std;
vector<int>prime;
bool vis[Maxn+10];
bool mark[N];
struct edge{
int v,next;
};
edge e[N];
int head[N],cnt,X[N],num,pre[N],used[N],a[N];
void add(int u,int v){
e[cnt].v=v,e[cnt].next=head[u];
head[u]=cnt++;
}
void init(){
Mem(vis,0);
for(int i=2;i<Maxn;i++){
if(!vis[i]){
prime.push_back(i);
for(int j=i+i;j<Maxn;j+=i) vis[j]=1;
}
}
}
void solve(int x){
int tmp=x;
for(int i=0;i<prime.size()&&prime[i]*prime[i]<=x;i++){
if(x%prime[i]==0){
int p=prime[i];
if(mark[tmp/p]) {
add(tmp/p,tmp);
add(tmp,tmp/p);
}
while(x%prime[i]==0) x/=prime[i];
}
}
if(x>1&&mark[tmp/x]){
add(tmp/x,tmp);
add(tmp,tmp/x);
}
}
void dfs1(int x,int id){
if(id==1)
X[num++]=x;
for(int i=head[x];~i;i=e[i].next){
int v=e[i].v;
if(!used[v]) {
used[v]=1;
dfs1(v,-id);
}
}
}
void work(int n){
Mem(used,0);
num=0;
for(int i=0;i<n;i++){
if(!used[a[i]]&&head[a[i]]!=-1){
used[a[i]]=1;
dfs1(a[i],1);
}
}
}
bool dfs(int u){
for(int i=head[u];~i;i=e[i].next){
int v=e[i].v;
if(!used[v]){
used[v]=1;
if(!pre[v]||dfs(pre[v])){
pre[v]=u;
return true;
}
}
}
return false;
}
int main() {
//FREI;
init();
int cas;
scanf("%d",&cas);
for(int i=1;i<=cas;i++){
Mem(mark,0);
cnt=0;
Mem(head,-1);
int n;
scanf("%d",&n);
for(int j=0;j<n;j++){
scanf("%d",&a[j]);
mark[a[j]]=1;
}
for(int j=0;j<n;j++){
solve(a[j]);
}
work(n);
int ans=0;
Mem(pre,0);
for(int i=0;i<num;i++){
Mem(used,0);
if(dfs(X[i])) ans++;
}
printf("Case #%d: %d\n",i,n-ans);
}
}