#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int h[]={0,3,2,1,2,3,2,3,4,3,4,5,4,5,6,5,6,7,6,7,8}; int p[2000000]; int a[100]; int bound,i,j,n,m,s,t; bool flag; int count(int x){ x = (x & 0x55555555) + ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); x = (x & 0x0000FFFF) + ((x >> 16) & 0x0000FFFF); return x; } int f(int x){ return h[p[x]]; } void IDA(int d,int x,int tmp){ if(d==bound){ if(tmp==t){ flag=true; } return ; } if(f(tmp^t)+d>bound||(m-x)+d<bound) return ; for(int i=x+1;i<=m;i++){ IDA(d+1,i,tmp^a[i]); if(flag) return ; } } int main(){ // freopen("e:\\in.txt","r",stdin); for(i=0;i<=1100000;i++) p[i]=count(i); int cas=0; while(1){ cas++; scanf("%d%d",&n,&m); scanf("%d%d",&s,&t); if(!n&&!m) break; for(i=1;i<=m;i++) scanf("%d",&a[i]); flag=false; for(bound=0;bound<=m;bound++){ IDA(0,0,s); if(flag) break; } printf("Case #%d: ",cas); if(!flag) printf("Impossible\n"); else printf("%d\n",bound); } return 0; }