Run Time: 0.019
Ranking (as of 2016-02-09): 27 out of 787
Language: C++
/*
UVa 11076 - Add Again
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11076_Add_Again.cpp
*/
#include <cstdio>
#include <cstring>
const int nr_digits = '9' - '0' + 1, N_max = 12;
int freqs[nr_digits], factorials[N_max + 1];
int main()
{
factorials[0] = factorials[1] = 1;
for (int i = 2; i <= N_max; i++)
factorials[i] = factorials[i - 1] * i;
while (true) {
int N;
scanf("%d", &N);
if (!N)
break;
memset(freqs, 0, sizeof(freqs));
for (int i = 0; i < N; i++) {
int d;
scanf("%d", &d);
freqs[d]++;
}
unsigned long long ds = 0;
for (int i = 1; i < nr_digits; i++)
if (freqs[i]) {
int f = factorials[N - 1];
for (int j = 0; j < nr_digits; j++)
if (freqs[j]) {
if (i == j)
f /= factorials[freqs[j] - 1];
else
f /= factorials[freqs[j]];
}
ds += i * f;
#ifdef DEBUG
printf("%d: %d %llu\n", i, i * f, ds);
#endif
}
unsigned long long s = 0;
for (int i = 0; i < N; i++, ds *= 10)
s += ds;
printf("%llu\n", s);
}
return 0;
}
No comments:
Post a Comment