题目大意:
给定n个数字求解n个数字的排列组合的和;
解题思路:
首先要知道一个定理:
若要求不重复序列的排列组合种类数目:
含重复数字时能构成的所有不重复排列的个数为:(n!)/((n1!)*(n2!)*...*(nn!)),其中ni指数字i出现的次数。
将这个次数记为S
以样例 1 2 3 为例子:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
抛开同一位上的重复数字不谈,
这些数字加在一起得到结果res,而res的每一位上的数字都是 1+2+3 = 6;
但是我们想要题意中的结果,就需要每一位上的数字都*num(个数)
而num怎么算呢:
我们已经知道了含重复数字的不重复序列的个数是S,而一共只有n个数字那么但看这一位的某一个数字出现的次数就是S/n
而我们又知道若每一位上的数字相同,那么结果就是6*11...11(n个1,以上为例),因此我们便可以得到结果
AC代码:
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define maxn 1e5
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ms(x,y) memset(x,y,sizeof(x))
#define mc(x, y) memcpy(x, y, sizeof(x))
#define rep(i,n) for(int i=0;i<(n);i++)
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
#define pii pair<int,int>
#define mp make_pair
#define FI first
#define SE second
#define IT iterator
#define PB push_back
#define Times 10
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const double eps = 1e-10;
const double pi = acos(-1.0);
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const ull INF = (1<<64) -1;//(ll)1e18+300;
const int maxd = 65;
int m, n;
int a[maxd];
ull A[maxd];
int num[maxd];
const ull cnt[] = {1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111};
void init() {
A[0] = 1;
A[1] = 1;
for (int i = 2; i < 14; i++){
A[i] = i;
A[i] =A[i] * A[i-1];
//cout << A[i] << " ";
}//cout << endl;
}
int main() {
//int t;
init();
//cin >> t;
while(cin >> n && n) {
int res = 0;
ms(num, 0);
for (int i = 0;i < n; i++) {
cin >> a[i];
res += a[i];
num[a[i]] ++;
}
ull ans = A[n];
for (int i = 0; i <= 9; i++){
ans /= A[num[i]];
}
ans = ans * res * cnt[n-1] / n;
cout << ans <<endl;
//for (int i)
}
}