题目链接: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. VUE组件如何与iframe通信问题

    vue组件内嵌一个iframe,现在想要在iframe内获取父vue组件内信息,由于本人技术有限,采用的是H5新特性PostMessage来解决跨域问题. postMessage内涵两个API: on ...

  2. 硬件开发之pcb---PCB抗干扰设计原则

    一 电源线布置: 1.电源线.地线的走向应与资料的传递方向一致. 二 地线布置: 1.数字地与模拟地分开. 2.接地线应尽量加粗,致少能通过3倍于印制板上的允许电流,一般应达2~3mm. 3.接地线应 ...

  3. DLR之 ExpandoObject和DynamicObject的使用演示样例

    ExpandoObject :动态的增删一个对象的属性,在低层库(比如ORM)中非常实用.因为ExpandoObject实现了IDictionay<string, object>接口,常见 ...

  4. Webx框架:依赖注入

    Webx的依赖注入和Spring的依赖注入很像,仅仅是有一点点的差别. 注入的时候仅仅能让生命周期长的注入到生命周期短的对象中,比方requestScope对象注入到singleton时就会错误发生. ...

  5. MFC项目实战(1)文件管理器--准备篇

    本程序主要实现如下功能: 程序通过左边的树形控件显示本地计算机中目录的结构,右边的列表控件则负责响应树形控件中选择的目录节点并把此节点中的所有项在列表框中显示出来,列表框支持奇偶行颜色设置,选中颜色设 ...

  6. md5 js

    js-md5 - npm https://www.npmjs.com/package/js-md5 var rotateLeft = function(lValue, iShiftBits) { re ...

  7. ps -ef | grep

    ps -ef | grep java   查看所有关于java的进程 root     17540     1  0  2009 ?        01:42:27 /usr/java/jdk1.5. ...

  8. Deep Learning 29: caffe入门学习

    1.跑教程:深度学习(六)caffe入门学习,上面有比较好的注释 .prototxt文件:网络结构文件 solver.prototxt:网络求解文件 net: "examples/mnist ...

  9. MySql安装与使用图文教程

      2.下载完成后将其解压到你想要安装的路径下,例如我的解压到D:\MySql\mysql-5.7.12-winx64\路径下,刚解压完应该是下图这些文件夹:最好解压到根目录. 5.新建一个my.in ...

  10. camera shading比例

    -- ---- vendor/mediatek/proprietary/custom/mt6735/hal/D2/camera_3a/isp_tuning_custom.cpp static MINT ...