UVa:11076 Add Again

来源:互联网 发布:照片贴图软件 编辑:程序博客网 时间:2024/05/22 15:02

第三百个题。

这个题比较好想。对于所有组合得到的整数来说,它们某个确定位上的数字就是给定的这些数字。

对于每个数字统计它出现的次数,然后算当这个数位于最后一位的时候,有多少种情况。这里用到了一个排列组合去掉重复元素的公式,也很简单。

算出所有数的所有情况以后再求和,这样再算n位就行了。

#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#define MAXN 100005#define MOD 1000000007#define INF 2139062143#define ll unsigned long longusing namespace std;int fac[15];int main(){    fac[0]=1;    for(int i=1; i<=12; ++i)        fac[i]=fac[i-1]*i;    int N;    while(scanf("%d",&N)&&N)    {        int num[12]= {0};        for(int i=0; i<N; ++i)        {            int t;            scanf("%d",&t);            num[t]++;        }        int val[12]= {0};        for(int i=0; i<=9; ++i)            if(num[i])            {                num[i]--;                int res=fac[N-1];                for(int j=0; j<=9; ++j)                    res=res/fac[num[j]];                val[i]=res;                num[i]++;            }        ll sum=0;        for(int i=0; i<=9; ++i)            sum+=i*val[i];        ll ans=0;        for(int i=0; i<N; ++i)        {            ans=ans+sum;            sum=sum*10;        }        printf("%lld\n",ans);    }    return 0;}


 

0 0
原创粉丝点击