#include<iostream>
#include<string>
#include<vector>
#define ll long long
using namespace std;
ll g[14][5000][14];
ll save[12313];
ll t = 0;
ll n;
ll s = 0;
ll cs[14];
ll ara[123213];
ll tam[123321];
ll ee;
ll bodau[14][50000][14];
ll ket = 0;
ll supe;
string na;
ll de = 1;
void dfs(ll gt)
{
if (gt < 0) return;
if (gt == 0)
{
for (int i = 0; i < t; ++i)
{
g[n][s][i] = save[i];
//g[n][s].push_back(save[i]);
}
// mình sẽ thực thi trong này !
//
/*
cout << "tong \n";
for (int i = 0; i < t; ++i)
{
cout << save[i];
if (i < t - 1) cout << "+";
}
cout << "="<<n<<"\n";
*/
s++;
return;
}
for (int i = 1; i <= n; ++i)
{
save[t++] = i;
//cout << gt << " chiu ko noi \n";
dfs(gt - i);
--t;
}
}
// khỡi tạo 1 bộ dấu mà chúng hiển thị mà ko cần phải tính lại chúng trong đây !
// chương trình này nó sẽ chỉ thực thi đúng 1 lần duy nhất !
// cũng có thể ko cần phải viết để lưu vì cái này ko có herisstric cho nên ko cần lưu trước thì
// xem nó hoạt động có ổn hay ko trong đây ! :))
void dfs2(ll tt,ll can )
{
if (tt >= can)
{
if (supe % 2 == 0 || supe % 3 == 0 || supe % 5 == 0 || supe % 7 == 0)
ket++;
return;
}
for (int i = 0; i < 2; ++i)
{
if (i & 1)
{
supe+= tam[tt];
dfs2(tt + 1, can);
supe -= tam[tt];
}
else
{
supe-= tam[tt];
dfs2(tt + 1, can);
supe += tam[tt];
}
}
}
int main()
{
//while (cin >> n)
for(int i=1;i<14;++i)
{
s = 0;
n = i;
dfs(n);
cs[i] = s;
//cout << s << "lklkl\n";
}
int test;
cin >> test;
while (test--)
{
cin >> na;
ll ef=0;
// mình tính thành chiều dài của con số ! trong đây !
n = 0;
for (ll i = 0; i < na.length(); ++i)
{
ara[i] = int(na[i] - '0');
}
ef = n = na.length();
/*
while (na)
{
ara[ef++] = na % 10;
na /= 10;
}
*/
// đảo thứ tự về vị trí ban đầu !
//for (ll i = 0; i < ef - 1 - i; ++i) swap(ara[i], ara[ef - i - 1]);
//for (int i = 0; i < ef; ++i) cout << ara[i] << ","; cout << "\n";
n = ef;
// reset ket về 0
ket = 0;// đây chính là kết quả ! cho từng trường hợp thử nghiệm !
ll tf = 0;
for (ll i = 0; i < cs[n]; ++i)
{
ee = 0;
tf = 0;
for (ll j = 0; g[n][i][j] != 0; ++j)
{
//cout << g[n][i][j];// chiều dài của con số
ll sh = 0;
ll dem = g[n][i][j];
//for(int jk=tf;jk<g[n][i][j];++jk)
while(dem)
{
// chỗ này hơi khó hiểu !trong đây !
sh = sh * 10 + ara[tf++];
dem--;
}
tam[ee++] = sh;
//tf += g[n][i][j];
// if (g[n][i][j + 1] != 0) cout << "+";
}
//cout << " sau khi ket thuc cai sum beu dien \n";
// sau khi có trong biến tạm !
// mình in ra thử xem nó có đúng hay ko ?
// reset mảng về ko !
ll supe = 0;
dfs2(0, ee);// chú ý là nó chỉ chãy đến ee
//cout << " chieu dai " << ee << " dsds\n";
//for (int j = 0; j < ee; ++j)
//cout << tam[j] << " ";
//cout << "\n";
//cout << "\n";
}
// https://w...content-available-to-author-only...j.com/PTIT/problems/P179PROC/
cout<<"Case #"<<de++<<": "<< ket/2 <<"\n";
// ko biết nó có đúng hoàn toàn hay chưa nhưng mình
// hi vọng nó có ý nghĩa cho 1 số bạn muốn biết về nó
// một lần nữa mình ko hề giấu giếm bất cứ luận điểm nào
// quan trọng là có bao nhiêu người hiểu code này !
// mình dùng quay lui và sinh nhị phân
// chương trình dư thừa khi nó có trùng lặp 1 số lượng gấp đôi
// và mình cũng ko biết tại sao lại vậy !
// code này mình chưa test , mình hi vọng có ai đó test code dùm mình
// và nếu bạn muốn thì nó là của bạn ,!
// mình viết code nhìu năm trời nhưng toàn những bài trên spoj
// ai muốn nhìn bài nào thì thoải mái
// chỉ cần đê cho mình yên ổn , đừng để ý đến mình ngoài xh mình cám ơn !
//
}
system("pause");
return 0;
}