题目描述:
dota游戏里面,召唤师可以控制冰雷火三种元素,并通过元素组合产生新的技能。现在我们修改了张新的地图, 地图中他能够控制n种元素, 并且将m个元素围成一个圈组成一 个新技能(这m个元素通过旋转或反转,算作重复,如123、231、312、 321、213、 132都算重复),那么召唤师能组合多少技能(20000>=n>=1 ,1<=m<=10000),由于结果可能很大,请将结果对000000007取余
正解传送门:
【Polay定理总结】【2019华为笔试】【普通涂色问题 组合数学】召唤师的技能——圆排列,翻转和项链排列
下面的别看 = =
分析:
根据题意,这是个圆排列去除圆的翻转排列
我先解释下圆排列
:
例子1:
[1]参考网址:例子来自知乎
圆排列的定义为:有一组元素,将其排成一个圆,这种排列叫做圆排列或项链排列
。
- 有五个小朋友,手拉手排成一个圆做游戏,求不同的排法数?
一般有两个思路:
- 假如五个小朋友手牵手变成圆排列,任意两个相邻的小朋友手松开就变成了一个直排列,即,任意一种圆排列对应五个不同的直线排列。五个小朋友站成一排有5!种方法,则手拉手有5!/5=4!种方法。
- 假如五个小朋友手牵手变成圆排列,五人按顺序移动一个位置其实是一种圆排列。所以固定其中一人,剩下四人任意排,有4!种方法。
一般地,有m个元素作圆排列,其计算公式为(m-1)!
例子2:
有5对夫妇和A、B共12人参加一场婚宴,他们被安排在一张12个座位的圆桌就餐,要求每对夫妻都相邻坐,A、B不相邻,甲、乙太太是闺蜜又要相邻坐,如果旋转之后相同算一种坐法,一共有多少种安排方法?
思路:
固定甲、乙太太两个人,有2种方法:甲乙或乙甲;甲、乙先生位置就定下来
剩下三对夫妻捆绑3!每对可以左右互换小排列2^3
A、B在四个空里插空,A(4,2)
综上:2x3!x2^3xA(4,2)=1152
比如: 123 的圆排列有:1 2 3 、3 1 2、2 3 1相同,
又有翻转排列有:321 的圆排列有:3 2 1、1 3 2、2 1 3。
123的翻转排列等价于123的圆排列,所以,123 的翻转圆排列数目为1.
本来只算圆排列,有1 2 3 、3 2 1两种,现在只有2/2=1种
从n个不同元素中不重复地取出m(1≤m≤n)个元素在一个圆周上,叫做这n个不同元素的圆排列。如果一个m-圆排列旋转可以得到另一个m-圆排列,则认为这两个圆排列相同。
n个不同元素的m-圆排列个数N为:
特别地,当m=n时,n个不同元素作成的圆排列总数N为:
故这里根据题意,圆排列的翻转排列必然不含在其圆排列中。故
翻转圆排列=圆排列数/2
注意到这里,每次都一定要选出m个元素来进行排列。
所以这里先对选出的元素,比如说x个不同的元素(出现一次),y个相同的元素(出现多次)进行圆排列,
我们知道x+y=n,且m=y*(元素重复次数)+x
根据上面的公式:
N=(n-1)!
思考:
由于地图中他能够控制n种元素, 并且将m个元素围成一个圈组成一 个新技能(这m个元素通过旋转或反转,算作重复,如123、231、312、 321、213、 132都算重复)
所以这里需要先从n个元素选出m个,也就是
C
m
n
=
A
m
n
n
!
=
m
!
n
!
(
m
−
n
)
!
C_m^n=\frac{A_m^n}{n!}=\frac{m!}{n!(m-n)!}
Cmn=n!Amn=n!(m−n)!m! 然后乘上
(
m
−
1
)
!
(m-1)!
(m−1)!
根据公式写代码即可。
种
数
=
m
!
(
m
−
1
)
!
n
!
(
m
−
n
)
!
种数=\frac{m!(m-1)!}{n!(m-n)!}
种数=n!(m−n)!m!(m−1)!
拓展
当圆排列里含有重复元素怎么办:
有关圆排列问题——m个相同的元素和n个不同的元素的圆排列解法。
根据圆排列规则,先将
n
+
m
n+m
n+m 个元素进行线排列有
(
m
+
n
)
!
(
m
!
)
\frac{(m+n)!}{(m!)}
(m!)(m+n)!种;又每
m
+
n
m+n
m+n 种线排列对应1种圆排列;
所以圆排列的种数为
(
m
+
n
−
1
)
!
/
(
m
!
)
(m+n-1)!/(m!)
(m+n−1)!/(m!)种;
注意:
圆排列中,经旋转可以重合的视为一种;