题目链接
定义num【i】为N个数中i出现的次数,这N个数形成的不同排列共有N!/(∏(i:0->9)(num【i】!)),由于一个数出现在每个位置的次数是一样的,所以答案为各个位上数字之和乘上排列数除以N乘上1+10+。。。+10^(N-1)。
附上AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<set>
#include<vector>
#include<map>
#include<string>
#include<cmath>
#define pq priority_queue
#define Pi acos(-1.0)
#define MAXX 1000000007
using namespace std;
unsigned long long num[15];
unsigned long long ans[15];
unsigned long long ok(unsigned long long x)
{
unsigned long long re=1;
while(x)
{
re*=x;
x--;
}
return re;
}
int main()
{
ans[1]=1;
for(int i=2;i<=12;i++)
ans[i]=ans[i-1]*10+1;
long long n,now;
unsigned long long nn,nnow,total,gg;
while(scanf("%lld",&n),n)
{
total=0;
nn=n;
memset(num,0,sizeof(num));
for(int i=0;i<n;i++)
{
scanf("%lld",&now);
num[now]++;
nnow=now;
total+=nnow;
}
gg=ok(nn);
for(int i=0;i<10;i++)
{
gg/=ok(num[i]);
}
gg*=total;
gg*=ans[n];
gg/=nn;
cout<<gg<<endl;
}
return 0;
}
Memory: 0 KB Time: 50 MS
Language: C++ 4.8.2 Result: Accepted