这道题目的意思简单易懂说的是给你n个数(可能有重复相同的数字),列出他们所有排列的情况,再逐位相加,求出和,例如:给你1,2,3,则排列的情况为<123>, <132>, <213>, <231>, <312>, <321> ,则相加的和为1332。思路很好把握,但是需要比较扎实的数学基础,因为该问题的核心公式需要理解和记忆否则很难做出来。

这道题目的核心知识点是:多重集合排列(也叫不全相异元素全排列),这里有一个定理:设S是一个多重集合,其中有k种不同的元素,各种元素的个数分别是:n1,n2,…nk。设S中所有元素的个数是n=n1+n2+...+nk。则S的全排列数(n-排列)为:n!/(n1!*n2!*n3!*...nk!)。

证明:通过观察和分析,我们会发现S的全排列中的每一种情况都包含了S中的每一个元素,并且每个元素在每一种情况中出现的次数都等于该种元素所拥有的元素个数。因此我们可以构造这样的一个排列,n个位置,n个元素,元素中存在同类元素(也可以看做是相同元素)。首先,我们为第1类的n1个元素指定位置,那么有C(n,n1)种情况。处理完后,我们接着对第2类的n2个元素指定位置,那么有C(n-n1,n2)种情况。以此类推,我们可以得出第k类的nk个元素指定位置有C(n-n1-n2-...-nk-1,nk)种情况。根据乘法原理,排列元素的的方法数为C(n,n1)*C(n-n1,n2)*...*C(n-n1-n2-..nk-1,nk)=n!/n1!(n-n1)!*(n-n1)!/n2!(n-n1-n2)!*...化简后n!/(n1!n2!...nk!0!)=n!/(n1!n2!...nk!)。

到这里,这道题目已经完成了70%了,剩下的30%则是对问题的又一个转化。我们知道,在全排列中,任意一个数字出现在各个位置上的次数是相同的,那么求和后,每一位上的数字的和都是每种数字出现的次数乘上每种数字的值然后求和,之后只需要乘上相应数位上的10^k并且考虑好进位就能算出结果。求每一位上每种数字出现的次数,则需要通过分析来化简,因为每一位上每种数字出现的次数是相同的,这是通过分析与观察得出的,那么我们只需要求出某一位上每种数字出现的次数即可,然后算出这一位的总和,由于每一位上的总共和都相同,只不过需要解决进位和乘上的10的次方来保证数位。值得一提的是,这道题目的数据会很大,存储答案的变量最好用unsigned long long 来存储。

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
int jc[15],num[12],re[15];
int main()
{
int n,i;
for(jc[0]=i=1;i<15;i++)
jc[i]=jc[i-1]*i;
while(scanf("%d",&n)!=EOF&&n)
{
memset(num,0,sizeof(num));
int t,m=0;
for(i=0;i<n;i++)
{
scanf("%d",&t);
num[t]++;
if(num[t]==1)
re[m++]=t;
}
unsigned long long temp,sum=0;
int j;
for(i=0;i<m;i++)
{
temp=jc[num[re[i]]-1];
for(j=0;j<m;j++)//计算某一位上的和,由于这一和值在每一位上都一样,所以只需要计算出一位即可。
{
if(j==i)
continue;
temp*=jc[num[re[j]]];
}
sum+=((jc[n-1]/temp)*re[i]);
}
temp=sum;
sum=0;
for(i=0;i<n;i++)
{
sum+=temp;
temp*=10;//将每一位的和还原到每一位上去。
}
cout<<sum<<endl;
}

return 0;
}

数论 UVA 11076的更多相关文章

  1. 【数论-数位统计】UVa 11076 - Add Again

    Add AgainInput: Standard Input Output: Standard Output Summation of sequence of integers is always a ...

  2. Uva 11076 Add Again (数论+组合数学)

    题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时 排列有多少种为kind1, 同理,假设数字k2 ...

  3. 数论 UVA 10780

    数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1 ...

  4. 数论 UVA 10943

    这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这 ...

  5. 数论 UVA 11889

    有关数论的题目,题目大意是给你两个数a和c,c为a和另一个数b的最小公倍数,要求你求出b的最小值.由最大公约数gcd(a,b)和最小公倍数lcm(a,b)之间的关系可知,lcm(a,b)*gcd(a, ...

  6. 数论 UVA 10791

    这道题目是关于满足同意最小公倍数的所有数对中两数之和的最小值. 题目大意是给你一个数n,要求你求出在所有以n为最小公倍数的数对中两数之和的最小值. 方法:将n进行质因数分解,再将所有分解出的质因子加起 ...

  7. UVA 11076 - Add Again(组合)

    题目链接 脑子抽了,看错题了,神奇的看成没有0了.主要问题把n个数插入m个相同的数,把m个数给分成1-m堆,然后插到n+1空里. #include <cstdio> #include &l ...

  8. 数论 UVA 11752

    题目大意是在1~2^64-1的范围内找到所有符合条件的数,条件要求这个数字是两个或两个以上不同数字的幂,例如64=8^2=4^3. 对于这一题,分析是:如果一个满足这个条件的数字一定可以转换成i^k, ...

  9. 数论 UVA 11388

    这道题是关于两个数的最大公约数和最小公倍数的题目.给你两个数字g,l,分别表示最大公约数和最小公倍数.要求你找到两个数a,b,要求这两个数的最大公约数和最小公倍数为所给的两个数.如果存在多组数字符合这 ...

随机推荐

  1. Deep Learning Papers Reading Roadmap

    Deep Learning Papers Reading Roadmap https://github.com/songrotek/Deep-Learning-Papers-Reading-Roadm ...

  2. js模板引擎

    js模板引擎包括如下: template 官方参考:http://aui.github.io/artTemplate BaiduTemplate 官方参考:http://baidufe.github. ...

  3. Appium自动化测试1 - 安装部署

    主要参考文章“虫师”自动化部署教程,不过结合自己的一些情况记录此博客~ 1.准备安装包 1)jdk; 下载及安装过程省略,我下载的是jdk1.7版本. 2) adt&SDK; SDK下载的是e ...

  4. [css]样式合并与模块化

    原文链接:http://www.zhangxinxu.com/wordpress/2010/07/css%E7%9A%84%E6%A0%B7%E5%BC%8F%E5%90%88%E5%B9%B6%E4 ...

  5. CSS设置透明的两种方式

    1..demo{ background-color:transparent; } 2..demo{ background-color:rgba(0,0,0,0.5); //最后一个参数是用来设置透明度 ...

  6. Asp.Net_单点登录

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. iOS 启动图那些坑

    当我们按照图片尺寸要求将所有的图片添加到工程中后,上传打包的工程时可能会出现一个问题:说工程中不存在启动图.但是我们明明已经导入启动图了,那么问题出在哪呢.我经过多次试验,发现压缩过后的图片作为启动图 ...

  8. a标签中的点击事件

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这 是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问 ...

  9. D:Balanced Lineup

    总时间限制: 5000ms 内存限制: 65536kB描述For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always lin ...

  10. Windows Store App 过渡动画

    Windows Store App 过渡动画     在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...