UVa-11076 Add Again(平均数思想)

来源:互联网 发布:linux 查看db2 序列号 编辑:程序博客网 时间:2024/06/05 16:24
思路:平均数思想

由于每个数出现在各个位的次数是一样的,

所以ans=每个位的平均数*排列数*n个1

如1 1 2 2   ans=((1+1+2+2)/4) * (A(4,4)/(A(2,2)*A(2,2)))*1111
#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const long long a[13]={0,1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111};long long fac[13];int main(){int n;int all,num;long long ans;int b[10];    fac[0]=1;    for(int i=1;i<=12;i++){    fac[i]=i*fac[i-1];//把每个数阶乘的结果存到数组里}while(cin>>n&&n!=0){all=0;memset(b,0,sizeof(b));for(int i=0;i<n;i++){cin>>num;all=all+num;b[num]++;//b[num]表示num的数有几个,num为0到9}ans=fac[n-1]*all;for(int i=0;i<10;++i){ans/=fac[b[i]];}cout<<(unsigned long long)ans*a[n]<<endl;}return 0;} 


0 0
原创粉丝点击