Problem C
Add Again
Input: Standard Input
Output: Standard Output
Summation of sequence of integers is always a common problem in Computer Science. Rather than computing blindly, some intelligent techniques make the task simpler. Here you have to find the summation of a sequence of integers. The sequence is an interesting one and it is the all possible permutations of a given set of digits. For example, if the digits are <1 2 3>, then six possible permutations are <123>, <132>, <213>, <231>, <312>, <321> and the sum of them is 1332.
Input
Each input set will start with a positive integer N (1≤N≤12). The next line will contain N decimal digits. Input will be terminated by N=0. There will be at most 20000 test set.
Output
For each test set, there should be a one line output containing the summation. The value will fit in 64-bit unsigned integer.
Sample Input Output for Sample Input
3 1 2 3 3 1 1 2 0 | 1332 444
|
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 10;
int cnt[N];
int n;
LL factorial(int x);
LL f(int x);
void solve();
bool input();
int main()
{
#ifndef ONLINE_JUDGE
freopen("e:\\uva_in.txt", "r", stdin);
#endif
while (input()) {
solve();
}
return 0;
}
bool input()
{
if (scanf("%d", &n) != 1 || n == 0) return false;
memset(cnt, 0x00, sizeof(cnt));
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
cnt[x]++;
}
return true;
}
LL factorial(int x)
{
if (x == 0 || x == 1) return 1LL;
else return (LL)x * factorial(x - 1);
}
LL f(int x)
{
LL ans = 0;
for (int i = 0; i < n; i++) {
ans = ans * 10 + x;
}
return ans;
}
void solve()
{
LL num = factorial(n);
for (int i = 0; i < N; i++) {
if (cnt[i] != 0) {
num /= factorial(cnt[i]);
}
}
LL ans = 0;
for (int i = 0; i < N; i++) {
if (cnt[i] != 0) {
ans += f(i) * num * cnt[i] / n;
}
}
printf("%lld\n", ans);
}