这道题目的意思简单易懂说的是给你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. iOS - CocoaPods 第三方开源框架管理

    1.CocoaPods CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 Github 上管理.该项目开始于 2011 年 8 月 12 日,在这 ...

  2. Tortoise 下修改服务器路径(Relocate与Switch)

    今天遇到SVN的路径变化,要在客户端修改服务器的下载路径,当初想直接删除重新checkout,后来想着还要重建项目比较麻烦,就找找修改服务器路径的方法.网上基本说的都是右键-->Relocate ...

  3. poj1625Censored!(AC自动机+dp)

    链接 第一次做这种题目,参考了下题解,相当于把树扯直了做DP,估计这一类题都是这个套路吧. 状态方程dp[i][next] = dp[i][next]+dp[i][j] ;dp[i][j]表示长度为i ...

  4. 关于 RxJava 技术介绍

    Awesome-RxJava RxJava resources Blog 给 Android 开发者的 RxJava 详解 -强烈推荐 扔物线的文章 讲解非常详细 NotRxJava懒人专用指南 -这 ...

  5. Gradle version 2.2 is required. Current version is 2.14.1.

    gradle版本错误: 1. 修改gradle\wrapper\gradle-wrapper.properties文件: distributionUrl=https\://services.gradl ...

  6. Myeclipse2016 部署webapp 至 tomcat 上出现 “There are no resources that can be added or removed from the server”

    对要部署的项目右键---Properties---Myeclipse---选中Dynamic Web Module 和 Java

  7. centos6.5安装sublime text 2

    今天在看ueillemmx的博客的时候,看到一神级编辑器,随即安装试了试,我了个去,果然好用,自动补全,自动对齐,样样精通啊! 下面是根据ueillemmx的步骤在CentOS上安装Sublime的过 ...

  8. Selenium for C#的入门Demo

    原文转载:http://www.cnblogs.com/halia/p/3562132.html?utm_source=tuicool 最近刚开始接触Selenium, 发现很多例子都是用java写的 ...

  9. iOS7中的ViewController切换

    转自:https://onevcat.com/2013/10/vc-transition-in-ios7/ iOS 7 SDK之前的VC切换解决方案 在深入iOS 7的VC切换效果的新API实现之前, ...

  10. table表格中实现tbody部分可滚动,且thead部分固定

    1.想要实现表格的thead部分固定切tbody部分可滚动,就需要将thead与tbody进行分离,具体做法是 1.设置thead,tbody都为display:block: 2.设置th与td的宽度 ...