题目链接: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 ;
}

最新文章

  1. &lt;&lt;&lt; Js中实现对字符串的截取
  2. [CareerCup] 16.5 Semphore 信号旗
  3. Farey Sequence
  4. nginx + Lua 实现自定义WAF
  5. GridView实现一个图片加多个文本框
  6. ABBYY FineReader 12最新官方版下载
  7. LoadRunner脚本 《第二篇》
  8. 百篇大计敬本年之系统篇《六》—— Ubuntu 16.04开启 root 超级用户
  9. JS选择checkbox
  10. CentOS如何查看端口是被哪个应用/进程占用
  11. 洛谷 P1093 奖学金
  12. learning makefile static model
  13. twisted 学习笔记一:事件循环
  14. Centos7限速和测速
  15. Linux 权限管理命令
  16. 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
  17. 认识Thymeleaf:简单表达式和标签 基础信息
  18. Ubuntu:编译Linux内核源代码和内核模块
  19. scalac:cannot connnect to compile server(idea 编译scala)
  20. CI框架的事务开启、提交和回滚

热门文章

  1. linux 中断机制浅析
  2. curl的使用(from 阮一峰)
  3. Puppet基于Master/Agent模式实现LNMP平台部署
  4. leetcode ----Trie/stack专题
  5. 自己定义Gradle插件之&amp;quot;Hello World&amp;quot;
  6. webstorm 6.0 注册码
  7. notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比方lua、python等)
  8. Linux —— 压缩文件
  9. 在云服务器 ECS Linux CentOS 7 下重启服务不再通过 service 操作,而是通过 systemctl 操作
  10. 记一次Tomcat无法正常启动的查错与解决之路