题意:
一个A和两个B可以形成三个字符串:"ABB","BAB","BBA".给定几个字母和它们对应的数字,计算总共可以形成多少个不同的字符串.
思路:
刚开始看这个话题感觉指数母函数,结果直接敲水,然后水wa了,哎,SB后来这个题目的答案肯定是几百个,然后自己写啊写啊写,各种各样的wa,后来放弃了,干脆去学习了JAVA大数,以前没用过,输入输出,转换格式,class刺了一个晚上,终于a了,费力啊,
事实上,这个话题不需要使用母函数,母函数计算复杂(自己JAVA什么都不会,刚学的结合到母函数里就觉得复杂) , 事实上,我们可以用组合数学的思想来做 ,想想N个不同的数字,它们可以组合的数字是 N!,但是样的数字可能出现在这个问题上,所以答案肯定相对较少,
假设这些数字是不同的 N!(n 不是标题中的n,而是所有数字的总数 sum),然后考虑同样的情况, 假如有AAA,一开始我们把它们当成三个不同的数字,所以只要除以这三个数字的组合数(1 * 2 * 3)可以恢复,一切都这样处理,答案是:
sum : 所有数字个数和
c[i] : i 有多少个
ans = sum! / (c[1]! * c[2]! * ...*c[n]!);
下面是你自己的 WA的母函数 和 Ac的组合数(Ac这个代码是在网上找到的。一开始,我自己JAVA什么都不会 ,明天再写一遍JAVA 常用的东西)
#include<stdio.h> c30c1261210c2261210 jcs15 DB_JC jcs0 1 i 1i 13i jcsi jcsi1 i ijknmscanf"%d"n n m 0i 1i ni scanf"%lf"ci mcii 0i mi c1i c2i 0 DB_JC c10 1.0 jcs0i 1i nij 0j mjk 0k j m k cik c2kj c1jjcskj 0j mj c1j c2jc2j 0 printf"%I64d\n"c1m jcsm 0
组合数学 Ac JAVA 代码
javautil javamath Main main args cinin f1 f2s26 n sum n cinnextIntn 0 sum 0 i0 ini si cinnextInt sum si f1"1" i1 isumi
f1 f1multiplyvalueOfi
f2"1" i0 ini j1 jsij
f2 f2multiplyvalueOfjoutprintln""f1dividef2
n cinnextInt