/*
博弈游戲
2到20的數,兩個人輪流取
取數不能取之前已取過數的倍數,或之前取過的兩個數的倍數之和
給出當前的一個合法局面,問先手要贏的策略
n<=20,比較明顯的mask dp
dp[mask]表示剩下mask表示的數,當前下手是贏還是輸
注意的是,多case,但是只算一次就行了,不用每個case都clear dp[]
因為知道了當前局面,就能確定之前選了什么數了
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<set>
#include<list>
#include<numeric>
#include<cassert>
#include<sstream>
#include<ctime>
#include<bitset>
#include<functional>
using namespace std;
char dp[1<<20];
void add(int &forbiden, int &multiple, int x)//forbiden為不能的位,multiple為之前選的那些數的倍數的位
{
for (int a = x; a <= 20 ; a += x) {
forbiden |= 1<<a;
multiple |= 1<<a;
forbiden |= multiple<<a;
}
}
bool win(int mask, int forbiden, int multiple, int x)
{
if (mask == 0) {
dp[mask] = -1;
return false;
}
if(dp[mask]) {
return dp[mask] > 0;
}
add(forbiden, multiple, x);
for (int i = 2; i <= 20; i++) {
if((mask & (1<<i-2)) == 0 || (forbiden&(1<<i)) )continue;
if (!win(mask ^ (1<<i-2), forbiden, multiple, i) ) {//這里提前退出了,有些子狀態并沒有算到
return dp[mask] = 1;
}
}
dp[mask] = -1;
return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
int T, t = 1, n;
for (scanf("%d", &T); T--; ) {
printf("Scenario #%d:\n", t++);
scanf("%d", &n);
vector<int> vt, have;
int vi[30] = {0}, mask = 0;
for (int i = 1,x; i <= n; i++) {
scanf("%d", &x);
vt.push_back(x);
vi[x] = 1;
mask |= 1<<(x-2);//
}
int forbiden = 0, multiple = 0;
for (int i = 2; i <= 20; i++) {//給出一個數,肯定給出他的所有因子
if (vi[i] || (forbiden & (1<<i)) ) continue;
add(forbiden, multiple, i);
}
// fill(dp, dp+mask+1, 0); 不用每次都clear
/*
不要搞一次win(mask)
然后取dp[mask ^ (1<<vt[i]-2),看win里面會提早退出的
所以有些dp[mask']沒算到,會為0
不過取win(mask ^ (1<<vt[i]-2))就行吧
*/
vector<int> ans;
for (int i = 0; i < vt.size(); i++) {
if (!win(mask^(1<<vt[i]-2), forbiden, multiple, vt[i])) {
ans.push_back(vt[i]);
}
}
if(ans.empty()) {
puts("There is no winning move.");
} else {
printf("The winning moves are:");
sort(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); i++) {
printf(" %d", ans[i]);
}
puts(".");
}
puts("");
}
return 0;
}