题目链接:https://cn.vjudge.net/problem/UVA-11076
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define read(x,y) scanf("%d%d",&x,&y)
#define ll unsigned long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int maxn =5e4+5;
const int mod=1e9+7;
/*
题目大意:给定一个序列,
要求全排列组成的数值的和。
简单的贡献思维,自己手动模拟下不难发现,
一个数的贡献首先在排列中是从高到低位各个位的贡献是一样的,
然后简单排列计数下即可。。
其实代码有点写烦了,
循环里面的那层关于10的累计可以放到外面(膜队友。。。)
*/
ll fac[20],cnt[20],jie[20];
ll ret,tp;
int n,x;
int main()
{
fac[0]=jie[0]=1;
for(int i=1;i<15;i++)
{
fac[i]=fac[i-1]*10;
jie[i]=jie[i-1]*i;
}
while(scanf("%d",&n)&&n)
{
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++)
{
scanf("%d",&x);
cnt[x]++;
}
ret=0;
for(int i=1;i<20;i++)
{
if(cnt[i]==0) continue;
tp=jie[n-1];
for(int j=0;j<20;j++)
{
if(cnt[j]==0) continue;
if(j==i) tp/=jie[cnt[j]-1];
else tp/=jie[cnt[j]];
}
for(int j=0;j<n;j++)
{
ret+=fac[j]*tp*1LL*i;
}
}
cout<<ret<<endl;///玄学。。。。
///printf("%I64d\n",ret);
}
return 0;
}
/*
12
1 2 3 4 5 6 7 8 9 10 11 12
*/