假设数字k在第一位,求出剩下N-1位的排列数m,就是在这一位上k出现的次数,在每一位上k出现的次数都是m,所以数字k的贡献就是1111.....×k×m
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#include <algorithm>
#define LL long long
int N;
int a[14];
int cur[10];
LL K[14];
LL P[14];
int main(){
K[1]=1;
K[0]=1;
P[1]=1;
for(int i=2;i<=12;i++){
K[i]=K[i-1]*i;
P[i]=P[i-1]*10+1;
}
while(~scanf("%d",&N)){
if(!N) break;
memset(cur,0,sizeof(cur));
for(int i=1;i<=N;i++){
scanf("%d",&a[i]);
cur[a[i]]++;
}
LL res=0;
for(int i=0;i<10;i++){
if(cur[i]==0) continue;
LL tmp=K[N-1];
for(int j=0;j<10;j++){
if(cur[j]>0){
if(j==i) tmp/=K[cur[j]-1];
else tmp/=K[cur[j]];
}
}
res+=tmp*i*P[N];
}
printf("%lld\n",res);
}
return 0;
}