ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 UVa11076

2019-11-30 21:02:20  阅读:239  来源: 互联网

标签:ch 题解 元素 while 一位数 ull ans UVa11076


题目大意 给出 \(n\) 个一位数,求出这些一位数组成的所有不同整数的和。

分析 考虑一个数对某一位的贡献,为这个数乘以其他数的全排列数,问题转化为可重复元素的全排列。

引理 \(n\) 个元素,可分为 \(m\) 组,其中本组元素全部相同,不同组元素不同,且第 \(i\) 组有 \(p_i\) 个,则总的排列数为

\[\frac{n!}{\prod_{k=1}^m p_k!}\]

证明可从 \(n\) 个位置放物品的组合数导出,这里略去。

则总的答案为各数位上的贡献之和。

#include<bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;

int n;
ull tmp, ans;
ull base[13] = {0, 1, 11, 111, 1111, 11111, 111111, 1111111, 11111111, 111111111, 1111111111, 11111111111, 111111111111};
map<ull, int> m;

ull Read()
{
    ull x = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9') ch = getchar();
    while(ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + (ch - '0');
        ch = getchar();
    }
    return x;
}

int main()
{
    while(~scanf("%d", &n) && n) {
        ans = 0, tmp = 1, m.clear();
        for(int i = 1; i <= n; ++i)
            tmp = tmp * i / (++m[Read()]);
        
        map<ull, int>::iterator it = m.begin();
        while(it != m.end())
            ans += it->first * tmp * it->second / n, ++it;
        
        printf("%llu\n", ans * base[n]);
    }
}

标签:ch,题解,元素,while,一位数,ull,ans,UVa11076
来源: https://www.cnblogs.com/whx1003/p/11963910.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有