UVA - 11076 Add Again (重复元素的排列)

Summation of sequence of integersis always a common problem in Computer Science. Rather than computing blindly,some intelligent techniques make the task simpler. Here you have to find thesummation of a sequence of integers. The sequence is an interesting
one and itis the all possible permutations of a given set of digits. For example, if thedigits are <1 2 3>, then six possible permutations are <123>,<132>, <213>, <231>, <312>, <321> and the sum ofthem is 1332.

Input

Each input set will start with apositive integerN (1≤N≤12).The next line will contain N decimal digits. Input will be terminated by N=0.There will be at most 20000 test set.

Output

For each test set, there shouldbe a one line output containing the summation. The value will fit in 64-bitunsigned integer.

SampleInput                             Outputfor Sample Input


3

1 2 3

3

1 1 2

0

 

1332

444

 


Problemsetter: Md. Kamruzzaman

Special Thanks: Shahriar Manzoor

题意:输入n个数字,这些数字任何一种排列都是一个数,求所有整数的和

思路:每个数字固定在一位的话,那么其他位的排列数*这个数,就是这个数可能产生的数的大小,那么其实每个数都是一样的,最后再把它算到每一位上

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
typedef unsigned long long ll;
using namespace std;
const int maxn = 20;

int num[maxn], f[maxn];
int n;

void init() {
	f[0] = f[1] = 1;
	for (int i = 2; i < maxn; i++)
		f[i] = f[i-1] * i;
}

ll cal(int x) {
	ll tmp = 1;
	for (int i = 0; i < 10; i++)
		if (i == x)
			tmp *= f[num[i]-1];
		else tmp *= f[num[i]];
	return (ll)(f[n-1]) / tmp;
}

int main() {
	int a;
	init();
	while (scanf("%d", &n) != EOF && n) {
		memset(num, 0, sizeof(num));
		for (int i = 0; i < n; i++) {
			scanf("%d", &a);
			num[a]++;
		}
		ll sum = 0;
		for (int i = 0; i < 10; i++)
			if (num[i])
				sum += (ll)(i) * cal(i);
		ll ans = 0;
		for (int i = 0; i < n; i++)
			ans = ans * 10 + sum;
		printf("%lld\n", ans);
	}
	return 0;
}

UVA - 11076 Add Again (重复元素的排列),布布扣,bubuko.com

时间: 2024-12-22 04:51:51

UVA - 11076 Add Again (重复元素的排列)的相关文章

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

含有重复元素的排列

Description 设R={ r1, r2, ……, rn }是要进行排列的n个元素.其中元素r1 ,r2 ,……,rn可能相同.试设计一个算法,列出R的所有不同排列.给定n以及待排列的n个元素.计算出这n个元素的所有不同排列. Input 输入数据的的第1行是元素个数n,1≤n≤500.接下来的1行是待排列的n个元素. Output 将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数. Sample Input 4 aacc Sample Output aacc

无重复元素的排列

/*========================================================== 设有n个整数的集合{1,2,3,......,n},从中任意选择r个数进行排列. 其中r<n,请列出所有排列. 思路:递归r层,每层选择一个数放到a[].当递归到r层时得到一组排列. 在每一层中做选择的时候,要把所有可能的选择都进行尝试. 具体看代码. ============================================================*/

Add Again(重复元素排序)

Add Again Input: Standard Input Output: Standard Output Summation of sequence of integers is always a common problem in Computer Science. Rather than computing blindly, some intelligent techniques make the task simpler. Here you have to find the summ

枚举有重复元素的排列的两种方法

我们假设A数组是方案数组,P数组是模板数组. 对于每一种方案,从第一个位置开始放元素,一个一个放. 我们原有的打印全排列的方法是不允许A数组中出现重复元素的,如下代码所示: void dfs(int dp) { if(dp>n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; ans++; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!vis[i

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

题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时的排列有多少种为kind1, 同理,假设数字k2在第一位然后求出剩下N-1位的排列数num2,我们就可以知道k2在第一位时的排列有多少种为kind2, k1*num1+k1*num2.....+kn*numn 就是我们要求的这些数对第一位的所有贡献,我们知道第一位的贡献=对第二位的贡献=第三位的贡献..... 把所有贡献加和,就能求出结果 知识:

有重复元素的排列问题

问题描述:设R={r1,r2,···,rn}是要进行排列的n个元素.其中元素r1,r2···rn可能相同.试设计一个算法,列出R的所有不同排列 算法设计:给定n及待排列的n个元素,计算出这n个元素的所有不同排列 设计思路:共有m个数的数组,排列到第k位时查看数组下标从k到m的数中是否有数字与下标为k的数字相等,相等的不交换,不相等则交换得新排列 #include<stdio.h> #include<stdlib.h> #include <string.h> void S

【数论】UVa 11076 - Add Again

Add AgainInput: Standard Input Output: Standard Output Summation of sequence of integers is always a common problem in Computer Science. Rather than computing blindly, some intelligent techniques make the task simpler. Here you have to find the summa

UVA 11076 Add Again

题目链接:UVA-33478 题意为给定n个数,求这n个数能组成的所有不同的排列组成的数字的和. 思路:发现对于任意一个数字,其在每一位出现的次数是相同的.换言之,所有数字的每一位相加的和是相同的. 所以我们只需求出这个"和"即可. 考虑任意一位i,假设我们在i位放置x,则对应\( (n-1)! / ( d_0! * d_1! * ... * d_x! * ... * d_9! ) \)种情况. 所以我们要求的"和"等于\(\sum_x x * (n-1)! / (