您的位置:首页 > 大数据 > 人工智能

UVa:11076 Add Again

2014-01-19 17:15 218 查看
第三百个题。



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

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

算出所有数的所有情况以后再求和,这样再算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 long
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: