一句话:将每个位上的每个不重复的数所作的贡献加起来就是所要求的答案
贡献的话 计算该数在这个位上出现的次数,也就是求有重复元素的重排列,它等于n!/(n1!*n2!...*nk!) n为ni之和,ni为各个数出现的次数,最后再乘上在该位的权值(10^k)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cmath>
#include <set>
using namespace std;
const int INF=1e9+100;
typedef long long ll;
int a[15];
ll p[13];
int vis[15];
int main(){
//freopen("out.txt","w",stdout);
int n;
p[0]=1LL;
p[1]=1LL;
for(int i=2;i<13;i++)
p[i]=1LL*p[i-1]*i;
int cas=1;
while(scanf("%d",&n)&&n){
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
vis[a[i]]++;
}
ll ans=0LL;
ll sum=1LL;
vector<int> v(a,a+n);
sort(v.begin(),v.end());
int size=unique(v.begin(),v.end())-v.begin();
for(int i=0;i<n;i++){
for(int j=0;j<size;j++){
if(v[j]){
int k=0;
vis[v[j]]--;
ll sum1=1LL*p[n-1];
for(int z=0;z<10;z++)
if(vis[z])
sum1/=p[vis[z]];
ans+=1LL*sum1*sum*v[j];
vis[v[j]]++;
}
}
sum*=10;
}
printf("%lld\n",ans );
}
return 0;
}