#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
const int inf=1e9+10;
typedef long long ll;
const int N=100010;
using namespace std;
int a[1010],b[1010];
int ans[1010][1010],dp[1010][1010];
//输出括号这个函数有错误,求的是对的,但输出的是错的
void print(int st,int ed)
{
if(st==ed)
{
if(st!=1)
printf(" *( M%d ) ",st);
else
printf("( M%d ) ",st);
return ;
}
if(st+1==ed)
{
if(st!=1)
printf(" *( M%d * M%d ) ",st,ed);
else
printf("( M%d * M%d ) ",st,ed);
return ;
}
print(st,ans[st][ed]);
print(ans[st][ed]+1,ed);
}
/*
这个是老师的代码,不过我感觉也不对
void combine(int i, int j)
{ if(i==j)
return;
combine(i, ans[i][j]);
combine (ans[i][j]+1, j);
printf("M%d * M%d",i,ans[i][j]);
printf(" and M%d * M%d",ans[i][j]+1,j);
}
*/
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=inf;
//cout<<dp[1][1]<<endl;
for(int i=1;i<=n+1;i++)
{
scanf("%d",&a[i]);
if(i>1)
b[i-1]=a[i];
}
for(int i=1;i<=n;i++)
dp[i][i]=0;
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
for(int k=i;k<j;k++)
if(dp[i][j]>dp[i][k]+dp[k+1][j]+a[i]*b[k]*b[j])
{dp[i][j]=dp[i][k]+dp[k+1][j]+a[i]*b[k]*b[j];ans[i][j]=k;}
}
}
printf("%d\n",dp[1][n]);
print(1,n);
//cout<<endl;
//combine(1,n);
return 0;
}
/*
3
10 100 5 50
7
5 10 20 5 100 30 40 200
*/