您的位置:首页 > 其它

SHU 2013 暑期集训(7-17)解题报告

2013-07-18 22:54 501 查看

Problem A (hdu 1261)

Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 71 Accepted Submission(s) : 14

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA".
给定若干字母和它们相应的个数,计算一共可以组成多少个不同的字符串.

Input

每组测试数据分两行,第一行为n(1<=n<=26),表示不同字母的个数,第二行为n个数A1,A2,...,An(1<=Ai<=12),表示每种字母的个数.测试数据以n=0为结束.

Output

对于每一组测试数据,输出一个m,表示一共有多少种字符串.

Sample Input

2
1 2
3
2 2 2
0


Sample Output

3
90
题目大意:给你n个字符,每个字符有a[i]个,问有多少种排列。
分析:公式比较容易推,就是sum!/(a[1]!*a[2]!*...*a
!),但需要高精度,本来写了高精度sum!除以高精度(a[1]!*a[2]!*...*a
!),但可恶的wa了,估计是写烂了。后来听了小贤的讲解,想到了另一种写法,就是先使用高精度算sum!,在计算sum!除以a[i]!的时候,枚举a[i]的每一个元素(2-a[i]),除以这个数(高精度)。


#include <iostream>
#include <cstdio>
#include <cstring>
#define maxlen 110
using namespace std;
int maps[maxlen][maxlen];
int n;
void DisPlay(int s)
{
for(int i=1;i<=s;++i)
{
for(int j=1;j<=i;++j)
{
if(j!=i)
cout<<maps[i][j]<<" ";
else
cout<<maps[i][j];
}
cout<<endl;
}
}
int main ()
{
memset(maps,0,sizeof(maps));
maps[1][1]=1;
for(int i=2;i<=30;++i)
{
for(int j=1;j<=30;++j)
{
maps[i][j]=maps[i-1][j]+maps[i-1][j-1];
}
}
while(scanf("%d",&n)!=EOF)
{
DisPlay(n);
cout<<endl;
}
}


View Code
总结:还是太弱,两道数学题完全不会,搜索写的还不是很熟练,没做的题尽量填坑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: