链接:早上九点多
什么是多重集排列,我就不说了,读者自己搜索吧。题目的结果就是所有数的和的阶乘除以每个数的阶乘。
一开始,想到用C++写,把和的因子及个数全都找出来,然后再找到每个数的因子及个数,减掉,最后再把剩下的因子乘起来,得出结果。结果发现,数字还是太大,没办法,直接上java吧。
来一个C++的,WA。
#include <iostream>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[50];
void yinzi(int n)
{
for (int k = 2; k <= n; k++)
{
int q = k;
for (int i = 2; i <= k; i++)
{
while (q % i == 0 && q)
{
a[i]++;
q /= i;
}
}
}
}
void sub(int n)
{
for (int k = 2; k <= n; k++)
{
int q = k;
for (int i = 2; i <= k; i++)
{
while (q % i == 0 && q)
{
a[i]--;
q /= i;
}
}
}
}
void ans()
{
int sum = 1;
for (int i = 2; i <= 27; i++)
{
if (a[i])
{
for (int j = 0; j < a[i]; j++)
sum *= i;
}
}
printf("%d\n", sum);
}
int main()
{
int n;
while (scanf("%d", &n) != EOF && n)
{
memset(a, 0, sizeof(a));
int b[50];
int sum = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &b[i]);
sum += b[i];
}
yinzi(sum);
for (int i = 0; i < n; i++)
sub(b[i]);
ans();
}
return 0;
}
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner (System.in);
int n, sum;
int[] data = new int[27];
BigInteger a, b;
while(cin.hasNext()){
n = cin.nextInt();
if(n == 0) break;
sum = 0;
for(int i = 0; i < n; i++){
data[i] = cin.nextInt();
sum += data[i];
}
a = BigInteger.valueOf(1);
for(int i = 2; i <= sum; i++)
a = a.multiply(BigInteger.valueOf(i));
for(int i = 0; i < n; i++){
b = BigInteger.valueOf(1);
for(int j = 2; j <= data[i]; j++)
b = b.multiply(BigInteger.valueOf(j));
a = a.divide(b);
}
System.out.println(a);
}
}
}