题解报告:hdu 1261 字串数
2024-09-30 12:32:14
题目链接: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 ;
}
最新文章
- <;<;<; Js中实现对字符串的截取
- [CareerCup] 16.5 Semphore 信号旗
- Farey Sequence
- nginx + Lua 实现自定义WAF
- GridView实现一个图片加多个文本框
- ABBYY FineReader 12最新官方版下载
- LoadRunner脚本 《第二篇》
- 百篇大计敬本年之系统篇《六》—— Ubuntu 16.04开启 root 超级用户
- JS选择checkbox
- CentOS如何查看端口是被哪个应用/进程占用
- 洛谷 P1093 奖学金
- learning makefile static model
- twisted 学习笔记一:事件循环
- Centos7限速和测速
- Linux 权限管理命令
- 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
- 认识Thymeleaf:简单表达式和标签 基础信息
- Ubuntu:编译Linux内核源代码和内核模块
- scalac:cannot connnect to compile server(idea 编译scala)
- CI框架的事务开启、提交和回滚
热门文章
- linux 中断机制浅析
- curl的使用(from 阮一峰)
- Puppet基于Master/Agent模式实现LNMP平台部署
- leetcode ----Trie/stack专题
- 自己定义Gradle插件之&;quot;Hello World&;quot;
- webstorm 6.0 注册码
- notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比方lua、python等)
- Linux —— 压缩文件
- 在云服务器 ECS Linux CentOS 7 下重启服务不再通过 service 操作,而是通过 systemctl 操作
- 记一次Tomcat无法正常启动的查错与解决之路