/*
典型动态规划题型,一次AC
题意:矩阵相乘,要求输出运算次数最少的运算式
思路:以第k个乘号为一个状态,状态方程:d(x1,x2)={max(d(x1,k)+d(k+1,x2)+x1*k*x2)|k属于[x1,x2)}
使用数组ans[x1][x2]存储相应的k值,最后使用递归输出!
*/
#include <cstdio>
#include <cstring>
const int nMax=15;
long long d[nMax][nMax];
int A[nMax][2];
int ans[nMax][nMax];
int N;
int dp(int x1,int x2)
{
long long &temp=d[x1][x2];
if(temp!=-1) return temp;
//temp=0;
for(int k=x1;k<x2;k++)
{
if(temp==-1)
{
ans[x1][x2]=k;
temp=dp(x1,k)+dp(k+1,x2)+A[x1][0]*A[k][1]*A[x2][1];
}
else if(dp(x1,k)+dp(k+1,x2)+A[x1][0]*A[k][1]*A[x2][1]<temp)
{
ans[x1][x2]=k;
temp=dp(x1,k)+dp(k+1,x2)+A[x1][0]*A[k][1]*A[x2][1];
}
}
return temp;
}
void print(int x1,int x2)
{
if(x1==x2)
{
printf("A%d",x1+1);
return;
}
printf("(");
print(x1,ans[x1][x2]);
printf(" x ");
print(ans[x1][x2]+1,x2);
printf(")");
}
int main()
{
//freopen("f://data.in","r",stdin);
int cas=1;
while(scanf("%d",&N) && N)
{
for(int i=0;i<N;i++)
{
scanf("%d%d",&A[i][0],&A[i][1]);
}
memset(d,-1,sizeof(d));
dp(0,N-1);
printf("Case %d: ",cas++);
print(0,N-1);
printf("\n");
}
return 0;
}