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
总结:还是太弱,两道数学题完全不会,搜索写的还不是很熟练,没做的题尽量填坑。
相关文章推荐
- SHU 2013 暑期集训(7-16)解题报告
- SHU 2013 暑期集训(7-18)解题报告
- SHU 2013 暑期集训(7-14)解题报告
- SHU 2013 暑期集训(7-15)解题报告
- 2013NBUT暑期集训成果赛 赛后总结以及解题报告
- 中南大学2012暑期集训中期检测训练赛“跳跳”解题报告
- 中南大学2012暑期集训中期检测训练赛“跳跳”解题报告
- 西南交大2011年第二次暑期集训比赛解题报告
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告
- 【题解】HNOI-2013 Day1解题报告
- 2013第四届 蓝桥杯c/c++B组预赛 解题报告
- HDU杭电2013 多校第一场解题报告
- 2014 UESTC暑前集训动态规划专题解题报告
- 2013 Multi-University Training Contest 3 解题报告(更新中)
- 2014 UESTC暑前集训图论专题解题报告
- Codeforces GoodBye2013 解题报告
- CSU-ACM暑假集训基础组训练赛(2) 解题报告
- NOIP2013提高组Day1 解题报告
- COCI 2013/2014 1st round, September 28th, 2013 解题报告
- 2013 ACM/ICPC 成都网络赛解题报告