【2019华为笔试】召唤师的技能——圆排列,翻转和项链排列

article/2025/9/20 20:20:20

题目描述:

dota游戏里面,召唤师可以控制冰雷火三种元素,并通过元素组合产生新的技能。现在我们修改了张新的地图, 地图中他能够控制n种元素, 并且将m个元素围成一个圈组成一 个新技能(这m个元素通过旋转或反转,算作重复,如123、231、312、 321、213、 132都算重复),那么召唤师能组合多少技能(20000>=n>=1 ,1<=m<=10000),由于结果可能很大,请将结果对000000007取余

正解传送门:

【Polay定理总结】【2019华为笔试】【普通涂色问题 组合数学】召唤师的技能——圆排列,翻转和项链排列

召唤师·卡尔(Polya定理)

下面的别看 = =

分析:
根据题意,这是个圆排列去除圆的翻转排列
我先解释下圆排列
例子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!(mn)!m! 然后乘上 ( m − 1 ) ! (m-1)! (m1)!

根据公式写代码即可。
种 数 = m ! ( m − 1 ) ! n ! ( m − n ) ! 种数=\frac{m!(m-1)!}{n!(m-n)!} =n!(mn)!m!(m1)!

拓展

当圆排列里含有重复元素怎么办:

原文:https://www.cnblogs.com/guhejian/p/5882845.html

有关圆排列问题——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+n1/(m!)种;
注意:
圆排列中,经旋转可以重合的视为一种


http://chatgpt.dhexx.cn/article/MZZ950RF.shtml

相关文章

圆排列问题

问题 圆排列问题&#xff1a;给定n个圆的半径序列&#xff0c;将它们放到矩形框中&#xff0c;各圆与矩形底边相切&#xff0c;求具有最小排列长度的圆排列。 解析 首先对于这个问题&#xff0c;使用分支限界计算&#xff0c;一定会遍历所有的排列情况&#xff0c;剪枝就是当前…

图文并茂详尽剖析圆排列问题

参考资料 https://blog.csdn.net/liufeng_king/article/details/8890603https://blog.csdn.net/qq_32400847/article/details/51474105https://blog.csdn.net/yzmck/article/details/4302554 原理解释的很赞http://www.doc88.com/p-079198350775.html http://www.docin.com/p-…

圆排列问题详解(原理+代码)

问题描述 给定n个大小不等的圆c1,c2,…,cn&#xff0c;现要将这n个圆排进一个矩形框中&#xff0c;且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。 问题分析 圆排列问题的解空间是一棵排列树&#xff0c;我们用回溯法在整个排列…

java字节序、主机字节序和网络字节序扫盲贴

java程序员是幸福&#xff0c;因为相对于C/C的不跨平台&#xff0c;JVM为我们屏蔽了大量的底层细节和复杂性&#xff0c;让我们能够将精力放在实现特定的业务逻辑上&#xff0c;所以使用java开发项目效率是比较高的。同时java程序员是悲哀的&#xff0c;就是因为JVM屏蔽了很多技…

字节序、位序

字节序 字节序&#xff0c;又称端序、尾序&#xff0c;英文单词为Endian&#xff0c;该单词来源于于乔纳森斯威夫特的小说《格列佛游记》&#xff0c;小说中的小人国因为吃鸡蛋的问题而内战&#xff0c;战争开始是由于以下的原因&#xff1a;我们大家都认为&#xff0c;吃鸡蛋前…

字节序的详细讲解

字节序 1、字节序的特点2、字节序转换函数2.1、htonl函数 发 将主机字节序的IP地址 转换成网络字节序的IP地址2.2、ntohl函数 收 将网络字节序的IP地址3.3、htons函数 发 将主机字节序的端口 转换成 网络字节序的端口3.4、ntohs函数 收 将网络字节序的端口 转换成 主机字节序的…

理解字节序 大端字节序和小端字节序

以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.csdn.net/yishengzhiai005/article/details/39672529 1. 计算机硬件有两种储存数据的方式&#xff1a;大端字节序&#xff08;big endian&#xff09;和小端字节序&#xff08;little …

什么是字节序?

字节序 字节序&#xff0c;顾名思义&#xff0c;就是字节组织的顺序。我们可以将其根据其存储时从低位开始还是从高位开始分为两种&#xff0c;具体如下&#xff1a; 类型简写本质大端BE(big endian)将高序字节存储在起始地址小端LE(little endian)将低序字节存储在起始地址 …

网络字节序和主机字节序详解(附代码)

一、网络字节序和主机字节序 网络字节序和主机字节序是计算机网络中常用的两种数据存储格式。 主机字节序&#xff1a; 指的是在计算机内部存储数据时采用的字节排序方式。对于一个长为4个字节的整数&#xff0c;若采用大端字节序&#xff0c;则该整数在内存中的存储顺序是&a…

字节序

1.字节序 字节序&#xff0c;又称端序或尾序&#xff0c;指的是多字节数据在内存中的存放顺序。例如一个int型变量x占用4个字节&#xff0c;假设它的起始地址&x为0x10&#xff0c;那么x将会被存储在 0x10、0x11、0x12和0x13位置上。 在用C写的客户端和Java写的服务端的通…

字节序详细解读

概念来了&#xff01;&#xff01;&#xff01; 字节序&#xff08;Byte Order&#xff09;是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 在计算机中是以字节为单位&#xff0c;每个地址对应一个字节&#xff0c;一个字节8bit。在C中&#xff0c;除了8bi…

JitPack的简单使用

JitPack的简单使用 由于工作需要,我要搭建多个项目,但是每个项目的基类,工具包,自定义的view,都是一样的,需要将这些代码复制到好几个项目里,所以萌生了一个想法,将这些基本不会改变的代码,做成一个依赖,一行代码引入项目 打开你的项目Git地址,创建发行版本 打开jitpack官网…

Gitee项目发布到JitPack

Gitee项目发布到JitPack 发布前的准备将Gitee项目发布到jitPack使用自己发布的库 发布前的准备 1.搜先注册一个Gitee账号 2.新建一个本地的android项目&#xff0c;并上传到Gitee。 (1) 根目录下build.gradle配置 dependencies {...classpath "com.android.tools.build:g…

【jitpack】android implementation 远程仓库

目录 前言接入步骤使用说明问题后记结束语 前言 做android的小伙伴都知道&#xff0c;android studio 在使用其他三方项目的时候使用gradle来管理版本,如直接使用如下就能快速把 appcopmt-v7 引入到项目中使用 implementation com.android.support:appcompat-v7:28.0.0 其实…

【JitPack】发布一个你自己的 Android 依赖库

文章目录 背景步骤新建 Android Library 项目配置 Gradle提交项目到 githubPull Request 到主分支创建 tag 并发布 release 版本JitPack 生成项目的依赖库第三方应用集成使用依赖库 JitPack 生成依赖库的 pom.xml 文件地址参考链接 背景 最近突然想开发个 Android Library&…

Android私有库gitee发布到JitPack后,编译通过但依赖不到。

JitPack编译通过后点击查看log只有这个&#xff1a; Subscription is not active right now Requested subscription: gitee.com/huile_1_0. Your subscriptions are listed in https://jitpack.io/w/user Please contact Support or repository admins if you need assistanc…

JitPack让第三方依赖更简单(第一种方法)

前面我们讲了如何将我们开发常用的工具发布到jcenter&#xff0c;然后进行依赖&#xff0c;这样有利于提高开发的效率&#xff0c;但是&#xff0c;又出现了一种新的发布方式&#xff0c;虽然现在使用的人还没有jcenter多&#xff0c;但是个人感觉未来使用的人会超过jcenter&am…

Android自定义library上传到JitPack

一、背景 最近公司不是太忙&#xff0c;闲的无聊&#xff0c;准备整理下属于自己的library库&#xff0c;想把自己平时用到的库保存起来到JitPack上&#xff0c;用的时候直接依赖添加。下面是我们把library发布到JitPack上去的记录过程。 二、项目配置 1.版本不同配置方法有些不…

maven { url “https://jitpack.io“ }

maven { url "https://jitpack.io" } 不能写在项目的build.gradle里面&#xff0c;要写在项目的setting.gradle

AndroidStudio之https://jitpack.io

前言 很多小伙伴自己写了一个库,打算开源出来,但是直接给别人发jar包或者aar包,别人使用都很不方便,而且版本更新也不方便,所以很多小伙伴把开源库放到了远程仓库里(如maven或jcenter),但是麻烦就麻烦在需要打包导出等。 而今天我要推荐一个超级方便的远程仓库:https://jitpa…