UVa 11076 (有重元素的排列) Add Again


n个可重复的元素的排列一共有= All种,其中

假设这些数依次为ai,每种数字有mi个。

从右往左考虑第d位数(d≥0),第i个数字出现的次数为,那么这个数字对所求答案的贡献为

其实可以先一次求出个位上每种数字对答案的贡献,然后乘上

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 typedef long long LL;
 5 
 6 const int maxn = 12;
 7 LL fac[maxn + 2], pow10[maxn + 2];
 8 int a[maxn + 2], b[maxn + 2], num[maxn + 2];
 9 
10 int main()
11 {
12     //freopen("in.txt", "r", stdin);
13 
14     fac[0] = pow10[0] = 1;
15     for(int i = 1; i <= maxn; i++) { fac[i] = fac[i-1] * i; pow10[i] = pow10[i-1] * 10; }
16     for(int i = 1; i <= maxn; i++) pow10[i] += pow10[i - 1];
17 
18     int n;
19     while(scanf("%d", &n) == 1 && n)
20     {
21         for(int i = 0; i < n; i++) scanf("%d", &a[i]);
22         sort(a, a + n);
23         int cnt = 0;
24         for(int i = 0; i < n;)
25         {
26             int j = i;
27             while(j < n && a[j] == a[i]) j++;
28             b[cnt] = a[i]; num[cnt++] = j - i;
29             i = j;
30         }
31         LL all = fac[n];
32         for(int i = 0; i < cnt; i++) all /= fac[num[i]];
33         LL sum = 0;
34         for(int i = 0; i < cnt; i++) sum += b[i] * num[i] * all / n;
35         printf("%lld\n", sum * pow10[n-1]);
36     }
37 
38     return 0;
39 }
代码君

优质内容筛选与推荐>>
1、一个实现图片上传/产生缩略图/在上传图片上写字功能的完整页面代码(转)
2、测试
3、centos服务器需要安装的几个基础包
4、调用系统相册,相机功能,遇到闪退的情况
5、BZOJ2062 : 素颜2(face2)


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn