题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1261

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个元素组成的多重集,其中a1重复了n1次,a2重复了n2次,…,ak重复了nk次,n=n1+n2+…+nk.
考虑n个元素的全排列,则不同的排列数为:n!/(n1!*n2!*n3!……nk!);因为12*26=312的阶乘肯定造成数据溢出,所以要用数组来保存每一位。这道题的做法是先对当前每一种字母的个数加到s变量中,从j=1开始依次对当前的每位进行(s+j)相乘,再从高位开始枚举除以b[i]的阶乘,这样的话就简单了,大数乘法+大数除法+数组存储。。。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
int a[],b[];//a数组来保存结果,b数组是来存每种字母的个数
int main()
{
int n,tmp,s,g;
while(cin>>n&&n){
memset(a,,sizeof(a));
s=,a[]=;//0的阶乘是1
for(int i=;i<n;i++){//表示有n种字母
cin>>b[i];
for(int j=;j<=b[i];j++){//从1开始枚举到当前的b数组元素
tmp=;//中间值
for(int k=;k<=;k++){//从低位开始向高位枚举当前结果的每一位
tmp=a[k]*(s+j)+tmp;//先乘上(s加上当前每一位)这里的for先计算字母总个数的阶乘
a[k]=tmp%;//只留小于10的数
tmp/=;//除数保存在tmp中
}
tmp=;//可以直接将tmp置为0,因为550够保存12*26阶乘结果的长度了,顺便除以当前数组b元素b[i]的阶乘
for(int k=;k>=;k--){//从高位开始枚举除法,参照公式
tmp=a[k]+tmp*;//与乘法相反,tmp做中间量乘以10
a[k]=tmp/j;//枚举当前每一位去除以j
tmp%=j;//取余当前除数并保存在tmp中
}
}
s+=b[i];//将每种字母的个数加到s
}
for(g=;g>=;g--)
if(a[g])break;//当最高位不为0是直接跳出
for(int i=g;i>=;i--)
cout<<a[i];//从高位(右边)输出
cout<<endl;
}
return ;
}

题解报告:hdu 1261 字串数的更多相关文章

  1. HDU 1261 字串数(排列组合)

    字串数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. hdu 1261 字串数

    解题思路:ACM紫书 第十章 P319 有重复元素的全排列 答案: 所有数的和的阶乘 除以 每个数阶乘的乘积 因为给定 (26*12)! 会爆掉(long long),这里用java 的BigInte ...

  3. HDOJ 1261 字串数

    JAVA大数.... 字串数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  4. 字串数_hdu_1261(大数极致).java

    字串数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  5. ACM题目————字串数

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

  6. hdu 4333 扩展kmp+kmp重复字串去重

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 关于kmp next数组求最短重复字串问题请看:http://www.cnblogs.com/z ...

  7. 题解报告:hdu 2093 考试排名

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的 ...

  8. 题解报告:hdu 2069 Coin Change(暴力orDP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...

  9. 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)

    Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...

随机推荐

  1. Android双列滑动表格(双表头不动)

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...

  2. MapReduce输入输出类型、格式及实例

    输入格式 1.输入分片与记录 2.文件输入 3.文本输入 4.二进制输入 5.多文件输入 6.数据库格式输入 1.输入分片与记录 1.JobClient通过指定的输入文件的格式来生成数据分片Input ...

  3. SQL yog过期后教你怎么让他不过期

    打开注册表  安装sqlyog后,进入注册表编辑器,进入\HEYK_CURRENT_USER\Software\,找到以{}括起来的那项直接干掉! 1, regedit 2,修改 3,

  4. android 浮动窗体学习笔记及个人理解(仿360手机助手)

    很感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序执行界面例如以下图: 1.程序入口界面 2.小浮动窗体 ...

  5. 2.NetDh框架之简单高效的日志操作类(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  6. android 之EditText输入检測

    近期开发一个功能的时候发生一个故事,其情节例如以下: 功能事实上不复杂,当中须要一个EditText来获取用户输入的信息.于是,我做了一个Dialog来显示我的输入界面(代码例如以下): mAlert ...

  7. [办公应用]从美国带回来的兄弟牌brother打印机如何处理

    周末帮朋友去调一台国外带回来的brother一体机,型号MFC-J630W.这是她单位老板从国外带回来的,说是便宜:不过她说只有英文说明书,她不太会操作.我想这还不容易么,就满口答应下来了.我先到br ...

  8. C 编程中fseek、ftell的用法总结

    fseek 函数功能是将文件指针移动到指定的地方,因此可以通过fseek重置文件指针的位置.函数原型: int  fseek(FILE *stream, long offset,  int origi ...

  9. 代理ip proxy

    import requestsimport timefrom selenium import webdriverfrom selenium.webdriver.chrome.options impor ...

  10. gsm model二次开发C#短信猫开发/长短信

    加QQ:83014588 向我索要,开发包 开发人员淘宝:http://t.cn/RhOj8W8 短信猫:http://item.taobao.com/item.htm?spm=686.1000925 ...