数论 UVA 11076
这道题目的意思简单易懂说的是给你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的更多相关文章
- 【数论-数位统计】UVa 11076 - Add Again
Add AgainInput: Standard Input Output: Standard Output Summation of sequence of integers is always a ...
- Uva 11076 Add Again (数论+组合数学)
题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时 排列有多少种为kind1, 同理,假设数字k2 ...
- 数论 UVA 10780
数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1 ...
- 数论 UVA 10943
这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这 ...
- 数论 UVA 11889
有关数论的题目,题目大意是给你两个数a和c,c为a和另一个数b的最小公倍数,要求你求出b的最小值.由最大公约数gcd(a,b)和最小公倍数lcm(a,b)之间的关系可知,lcm(a,b)*gcd(a, ...
- 数论 UVA 10791
这道题目是关于满足同意最小公倍数的所有数对中两数之和的最小值. 题目大意是给你一个数n,要求你求出在所有以n为最小公倍数的数对中两数之和的最小值. 方法:将n进行质因数分解,再将所有分解出的质因子加起 ...
- UVA 11076 - Add Again(组合)
题目链接 脑子抽了,看错题了,神奇的看成没有0了.主要问题把n个数插入m个相同的数,把m个数给分成1-m堆,然后插到n+1空里. #include <cstdio> #include &l ...
- 数论 UVA 11752
题目大意是在1~2^64-1的范围内找到所有符合条件的数,条件要求这个数字是两个或两个以上不同数字的幂,例如64=8^2=4^3. 对于这一题,分析是:如果一个满足这个条件的数字一定可以转换成i^k, ...
- 数论 UVA 11388
这道题是关于两个数的最大公约数和最小公倍数的题目.给你两个数字g,l,分别表示最大公约数和最小公倍数.要求你找到两个数a,b,要求这两个数的最大公约数和最小公倍数为所给的两个数.如果存在多组数字符合这 ...
随机推荐
- WinForm关闭窗体彻底的退出方式
//System.Environment.Exit(0); //Process.GetCurrentProcess().Kill(); //System.Threading.Thread.Curren ...
- Deep Learning 4_深度学习UFLDL教程:PCA in 2D_Exercise(斯坦福大学深度学习教程)
前言 本节练习的主要内容:PCA,PCA Whitening以及ZCA Whitening在2D数据上的使用,2D的数据集是45个数据点,每个数据点是2维的.要注意区别比较二维数据与二维图像的不同,特 ...
- Java 类中各成分加载顺序 和 内存中的存放位置
参加一个笔试,有一个关于类的静态代码块.构造代码块.构造函数的执行顺序的问题.不太清楚,网上百度了一下.在这里记录一下. 一.什么时候会加载类?使用到类中的内容时加载:有三种情况1.创建对象:new ...
- c/c++ 软件集成 安装和可卸载软件
作为一个工程师应具备的一些能力: 1. 首先具备这款软件: >inno Setup 免费版还开源,良心货,妥妥的. 2. 这款软件上手也比较款,可自行参考使用文档 3.编译成功,生 ...
- 内嵌页js与ios和安卓的交互
ios: 一个iframe,改变url会发送一个请求,把url设置成就是bridge://xxxxx客户端就可以拦截请求,并在全局变量xxxxx中取出一个字符串.例如{event:'click'},可 ...
- 并发编程 10—— 任务取消 之 关闭 ExecutorService
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 随机抽奖 --java
使用Math.random() 1.Math.random() 返回double类型. /** * 随机得到获奖名单 * @param assocs * @param prizeNumber * @r ...
- React Native 文本输入
TextInput是一个允许用户输入文本的基础组件.它有一个名为onChangeText的属性,此属性接受一个函数,而此函数会在文本变化时被调用.另外还有一个名为onSubmitEditing的属性, ...
- Lua知识备忘录
最近对Lua很感兴趣,以下是本阶段学习的总结,包含三部分,一部分是基础语法,一部分是扩展和解释器嵌入,最后一部分是Lua小练习. 知识涉及:Lua语言编程基础:Lua&C++:Lua扩展.嵌入 ...
- iOS开发多线程篇—线程的状态
iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(te ...