#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = 1e8+9; void Add(int &a,int b){ a += b; if(a >= MOD)a -= MOD; } int vis[10][33][22][1<<10]; int dp[10][33][22][1<<10]; int TT; int prime; int n; int bit[10][33]; int dfs(int id,int pos,int sum,int s){ if(id == n){ id = 0; pos--; sum = 0; if(pos == -1)return 1; } if(vis[id][pos][sum][s] == TT)return dp[id][pos][sum][s]; int end = (s&(1<= prime)break; Add(ans,dfs(id+1,pos,sum+i,i == end? s : (s & (~(1<= 1); int iCase = 0; while(T--){ iCase++; TT++; scanf("%d%d",&n,&prime); assert(n >= 1 && n <= 10); assert(prime == 2 || prime == 3 || prime == 5 || prime == 7 || prime == 11 || prime == 13 || prime == 17 || prime == 19); long long tot = 1; for(int i = 0;i < n;i++){ scanf("%d",&x[i]); assert(x[i] >= 1 && x[i] <= 1000000000); tot = tot*(1+x[i])%MOD; } tot -= solve(); tot = (tot%MOD+MOD)%MOD; printf("Case #%d: %d\n",iCase,(int)tot); } return 0; }