实用算法实践-第 30 篇 组合数学

组合数学第一章复习 从广义上讲组合数学就是离散数学。 1.1 基本计数法则 加法法则 若 |A| = m , |B| = n , A⋂⋂\bigcapB = ⊘⊘\oslash , 则 |A⋃⋃\bigcupB| = m + n 。 乘法法则 若 |A| = m , |B| = n , AxB = {(a,b) | a ∈∈\inA,b ∈∈\in B}, 则 |A x B| = m · n 。 【例... 阅读详情

30.1    Ctalan数

PKU JudgeOnline, 1095, Trees Made to Order.

30.2    Fibonacci数

Fibonacci数列的定义如下:

f(n) = f(n - 1) + f(n - 2) (n >= 3)

f(1) = 1, f(2) = 2

f(0)可定义为1。

用归纳法可以证明性质:

f(n + m) = f(m - 1)f(n + 1) + f(m - 2)f(n)  (m>= 2)

利用这条性质,我们可以将比较大的n的Fibonacci数转化成比较小的Fibonacci数,从而使计算起来更为方便。

这里有一个问题:

Fibonacii数列 Fn (mod k) 的循环节长度是多少?有没有关于k的通项公式或者计算方法?

30.2.1   实例

PKU JudgeOnline, 3070, Fibonacci.

30.2.2   问题描述

给定n,要求第n个Fibonacci数mod 10000的结果。

30.2.3   输入

0

9

999999999

1000000000

-1

30.2.4   输出

0

34

626

6875

30.2.5   分析

可以通过Fibonacci的性质和模运算的性质对之进行递归求解。通过鸽巢原理可以知道输出必定是一个循环。如果知道循环节,该问题就更简单了。循环节也很好找。

30.2.6   程序

#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
#define repeatTime	50
#define __int32Max 2147483648
//0x7FFFFFFF = 2147483647 = 536870911.75 * 4
#define maxSize 5000000
int F[maxSize];
int ModularFibonacci(int n, int p)
{
	//0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
	//0  1  2  3  4  5  6  7   8   9
	int temp;
	if(n < 0)
		return 0;
	if(n < maxSize && F[n] != 0){
		return F[n];
	}
	if(n % 2 == 0){
		temp = ((ModularFibonacci(n / 2 - 1, p) * ModularFibonacci(n / 2 + 1, p)) + (ModularFibonacci(n / 2 - 2, p) * ModularFibonacci(n / 2, p))) % p;
	}else{
		temp = ((ModularFibonacci(n / 2, p) * ModularFibonacci(n / 2 + 1, p)) + (ModularFibonacci(n / 2 - 1, p) * ModularFibonacci(n / 2, p))) % p;
	}
	if(n < maxSize){
		F[n] = temp;
	}
	return temp;
}
int main()
{
	int n;
	memset(F, 0, sizeof(F));
	F[0] = 1;
	F[1] = 1;
	F[2] = 2;
	F[3] = 3;
	F[4] = 5;
	while(cin >> n && n != -1){
		cout<< ModularFibonacci(n - 1, 10000) << endl;
	}
	return 1;
}

30.3    Pólya计数定理

Pólya计数定理是组合数学种一个非常重要的定理。它可以用来解决类似于计算不同着色方案数的问题。

《算法艺术与信息学竞赛》从着色方案的角度介绍了Pólya计数定理。相对于组合数学教材中的Pólya计数定理的形式化描述,该介绍较为容易理解。不过似乎该文介绍的只是Pólya计数定理的一种特殊化表达。

30.3.1   实例

PKU JudgeOnline, 2409, Let it Bead.

30.3.2   问题描述

一个手镯由c种颜色的s个珠子串起来。问对已知的c和s,手镯可以有多少种。

30.3.3   输入

11

21

22

51

25

26

62

00

30.3.4   输出

1

2

3

5

8

13

21

30.3.5   分析

这个问题是基本的着色问题。解决这类问题,可按照如下的步骤进行:

1. 分析置换群的种类和个数。

2. 分析每个置换的循环分解式和循环节。

3. 根据Pólya计数定理计算方案数。

对于这个问题,可以知道置换既可以是为旋转(rotation),也可以是翻转(reflection)。旋转和翻转的类型分别为s种。旋转每增加一个360/s度,对应于升序置换的一次循环右移。翻转轴旋转一个360/s度,对应于降序置换的一次循环右移。所以置换很容易计算出来。

有了置换的具体表示,其循环分解式和循环节就很容易计算出来了。

       对每种置换进行计算,根据公式求和,就算出了着色的不同方案。

30.3.6   程序

#include<string.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int permutation[100];
int c;
int s;
void visit1(int i)
{//输出循环分解式
     int j;
     int temp;
     j = i;
     while(permutation[j]!= i){
         cout << j <<" ";
         temp = permutation[j];
         permutation[j] = 0;
         j = temp;
     }
     cout << j <<" ";
     permutation[j] = 0;
     cout << endl;;
}
void visit(int i)
{//不输出循环分解式,仅用来计算循环节
     int j;
     int temp;
     j = i;
     while(permutation[j]!= i){
         temp = permutation[j];
         permutation[j] = 0;
         j = temp;
     }
     permutation[j] = 0;
}
int cycleNum()
{//计算置换的循环节
     int num;
     int i;
     num = 0;
     for(i = 1;i <= s; i++){
         if(permutation[i]!= 0)
         {
              visit(i);
              num++;
         }
     }
     return num;
}
int exponent(int a, intb)
{//计算a^b b必须大于
     int i;
     int temp;
     temp = 1;
     for(i = 0;i < b; i++){
         temp = temp * a;
     }
     returntemp;
}
int main()
{
     int i, j;
     intgroupSize;
     int sum;
     int temp;
     while(cin>> c >> s){
         if(c ==0 && s == 0)
         {
              break;
         }
         //cout<< cycleNum();
         sum = 0;
         for(i =0; i < s; i++){
              for(j= 1; j <= s - i; j++){
                   permutation[j] = j + i;
              }
              for(;j <= s; j++){
                   permutation[j] = j + i - s;
              }
              temp = cycleNum();
              sum += exponent(c, temp);
         }
         for(i =1; i <= s; i++){
              for(j= 1; j <= i; j++){
                   permutation[j] = i - j + 1;
              }
              for(;j <= s; j++){
                   permutation[j] = i + s - j +1;
              }
              temp = cycleNum();
              sum += exponent(c, temp);
         }
         groupSize = s << 1;
         sum = sum / groupSize;
         cout << sum << endl;
     }
}

 本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

字节算法大佬亲撰 30W 字数据算法笔记 算法基础篇,算法应用篇,算法面试篇。共 13 章。整整 30W 字。章节展示。 阅读详情

相关推荐

Python实现数学建模竞赛常用30算法

MOFCEM是将模糊数学和多目标决策分析相结合的产物,适用于目标值和评价准则都具有模糊性的情况。它将复杂问题分解为多个单目标问题,并通过模糊数学方法进行评价和排序,从而得到最优或较优的决策方案。定义模糊集和隶属度函数:将定性概念通过模糊集合理论转换为定量分析。构建评价矩阵:根据隶属度函数获取各指标的隶属度,形成评价矩阵。权重分配:确定各指标的重要性,构建权重向量。综合评价:将评价矩阵与权重向量相结合,得出综合评价结果。决策选择。

weixin_31620365的博客 1421

实用算法实现-第 30 篇 组合数学

30.1 Ctalan数 PKU JudgeOnline, 1095, Trees Made to Order. 30.2 Fibonacci数 Fibonacci数列的定义如下: f(n) = f(n - 1) + f(n - 2) (n &gt;= 3) f(1) = 1, f(2) = 2 f(0)可定义为1。 用归纳法可以证明性质: f(n + m) = f(m - 1)...

luotuoass 195

EVEN算法生成排列实验

东南大学 组合数学实验 含代码及文档 EVEN算法生成排列实验

组合数学(四种求组合数的方法:递推,逆元,lucas,卡特兰数)

求组合数,对于不同的数据量可以用不同的方法。实际上只用记住最高效的那个方法即可。本文将介绍四种求组合数的办法。

clmm_的博客 4289

WorldQuant Brain Alpha 生成器

一个自动化工具,通过参数优化和回测来挖掘高质量的量化交易 Alpha 因子,并自动提交符合标准的因子。

weixin_37582383的博客 1万+

台达伺服B3驱动器参数的设定和CN1的接法

3. B2的电子齿轮比是直接设定P1-44(分子)和P1-45(分母)就就可以的,但是B3的有个隐藏的细节,就是P1-44的默认值77216不用去更改,这是官方客服说的,需要改的是P1-45这个参数,比如说,我使用的丝杆螺距是5mm的,那么就是以5000脉冲走完5mm为一圈,则就把P1-45设定为5000即可;我的是三菱FX3S系列的PLC,是NPN型的,输出点是24V-作为信号的,所以接41、37,具体可参考B3的。,跟着客服的讲解操作才解决的,以下就是解决方法,希望能够帮到需要的各位。

qq_38681017的博客 1万+

java实现排列组合算法

java排列组合算法 ,

月色无痕的专栏 6396

使用ST-LINK烧录stm32教程说明

使用ST-LINK烧录stm32

qq_34426854的博客 1万+

组合数:从基础理论到高效算法实现

组合数的计算既是经典的数学问题,也蕴含着丰富的算法思想。在算法竞赛中也常常出现,要好好理解组合数的思想,感受下组合数的魅力。

a13997460860的博客 2254

一篇教你杰理63系列蓝牙双设备主从连接传输数据过程及配置

首先打开632sdk的app_config.h文件,将宏CONFIG_APP_SPP_LE写0,将宏CONFIG_APP_MULTI写1,对应的CONFIG_BT_GATT_CLIENT_NUM写1代表我只连接一个主机设备。属性都可以修改为自己想要的属性,然后关掉文件,双击gatt_inc_generator.exe文件运行,就会自动弹出生成/更新后的gatt_profile_cfg.h文件,然后里面就是我们代码里面所需要的配置,都是十六进制表示,找到我们刚刚添加的服务属性配置,复制到代码里面去。

xiaolizaixian的博客 1375

微信小程序 - 超详细小程序接入腾讯地图的完整流程,提供地图显示、IP 属地定位、地理位置名称、获取经纬度等超多功能示例(可一键复制并运行的功能源代码,详细的注释及常见问题汇总)小白直接上手!

微信小程序腾讯地图怎么接入,小程序项目中使用腾讯地图sdk,小程序中使用腾讯地图,微信小程序集成腾讯地图功能,微信小程序通过ip获取其地址、经纬度、详细地址,小程序使用腾讯地图跨域解决方法,微信小程序引入腾讯地图详细教程,原生小程序引入腾讯地图,微信小程序如何植入腾讯地图,微信小程序腾讯地图配置及使用详细教程,小程序植入腾讯地图SDK,微信小程序项目怎么用腾讯地图,微信小程序IP属地定位,获取当前用户位置名称,微信小程序如何使用腾讯地图获取用户的定位位置,在小程序中使用腾讯地图,实现定位,距离计算,实时搜索

🏆 前端领域优质创作者 8804

找工作知识储备(1)---从头说catalan数及笔试面试里那些相关的问题

作者:寒小阳时间:2013年9月。出处:http://blog.youkuaiyun.com/han_xiaoyang/article/details/11938973。声明:版权所有,转载请注明出处,谢谢。 0、前言 当年博主自己参加校招笔试面试时就遇到过几次catalan数相关的题目,今年又到了互联网招聘季,翻看下近期各大公司的笔试面试题,发现它依旧是很容易被考察的点。尴尬的是,博主自己觉得cat...

iteye_2022的博客 675

电子元器件-接口电路篇:RS-232、RS485/422、I2C、SPI、USB、网口

以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;

qq_60226558的博客 887

组合数学——求组合数

计数原理,排列组合,二项式定理和多项式定理,求组合数(循环+费马小定理,杨辉三角,阶乘表和逆元表,Lucas定理)

m0_73693552的博客 1488

CondaHTTPError: HTTP 404 not found for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs解决方案

本文主要介绍了CondaHTTPError: HTTP 404 not found for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 17万+

【Claude】Claude Code 子代理(Subagents)完全指南:多 AI 编排与并行任务管理

子代理是在独立上下文窗口特性主代理子代理上下文窗口与你对话的主上下文完全独立的上下文工具权限拥有所有工具可自定义限制生命周期整个会话完成任务后结束通信方式直接对话结果返回给主代理模型继承主会话设置可指定不同模型你可以创建专属子代理,指定模型、工具权限和系统提示。在对话中,Claude 会根据任务自动选择合适的子代理。

博客 5538

数学建模常用30个算法——Python代码(一)

K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。用于分析和预测时间序列数据,结合自回归(AR)、差分(I)和移动平均(MA)来建模趋势和季节性。基于树状结构进行决策,通过特征分裂实现分类,直观易解释,如ID3、C4.5和CART算法。

Magnolia_He的博客 2887

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

质数交响曲:从数字组合到数学美学的算法探秘

给定数组nums,我们需要找出所有子集S ⊆ nums,使得:其中p₁, p₂, ..., pₖ是互不相同的质数关键洞察:这个问题本质上是关于整数的质因数分解和组合计数。「好子集的数目」这个问题完美展现了算法设计与数学思维的深度融合。数论的应用价值:质数分解理论在算法设计中的实际应用组合数学的威力:如何系统性地计数而避免重复动态规划的优雅:将复杂问题分解为可管理的子问题状态压缩的巧妙:利用问题约束将指数复杂度转化为可处理范围这个问题告诉我们,在算法设计中,深刻理解问题的数学本质往往比编写代码更重要。

司徒鸿的博客 1675

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Rust算法——阶乘与排列组合——递归与数学算法的 Rust 实现

本文介绍了如何在Rust中实现阶乘、排列组合等基础数学算法。主要内容包括:阶乘的递归、迭代和迭代器三种实现方式,针对大数阶乘使用BigUint类型;排列数的计算公式优化及回溯算法生成所有排列;组合数的计算与生成方法。文章对比了不同实现方式的性能特点,提供了防止溢出的安全处理方案,并给出了实际应用示例,展示了Rust在数学计算中的高效实现和类型安全特性。

红目香薰 1089

常见30种数学建模模型_数学建模国赛 之算法模型分类概述

点击上方"蓝字",关注了解更多数学建模国赛之算法模型分类概述数学模型的合理、高效率引用学习,有助于尽早解答问题,下面简要介绍分类及其注意事项,大概可以按一下几点分类:(1)按模型的数学方法分:几何模型、图论模型、微分方程模型、概率模型、最优控制模型、规划论模型、马氏链模型等。模型的数学方法一般是根据题目具体而定的,例如2017年的CT重建,可以说是几何数学求解的,几乎没有模型,类似于初中...

weixin_39607090的博客 4万+

从自然数拆解到算法优化:探索组合数学在编程竞赛中的妙用

本文深入探讨了组合数学在编程竞赛中的应用,特别是自然数拆解问题的算法优化。通过分析整数划分的数学本质,介绍基础回溯算法及其优化策略,包括数学剪枝和动态规划,提升解题效率。文章还涵盖了竞赛实战技巧和多语言实现对比,帮助参赛者掌握这一关键技能。

transformer2023的博客 929

一、引论,《组合数学(第4版)》卢开澄 卢华明

发现自己数数题做的很烂,重新学一遍组合数学吧。参考卢开澄 卢华明 编著的《组合数学(第4版)》,只打算学前四章。通过几个经典问题来了解组合数学所研究的内容。

EQUINOX1的博客 1114

【免费下载】 数学建模30个常用算法(Python)

数学建模30个常用算法(Python) 【下载地址】数学建模30个常用算法Python 本仓库提供了一个包含30个常用数学建模算法的资源文件,所有算法均使用Python实现。这些算法涵盖了数学建模中常见的各种问题,包括但不限于优化问题、统计分析、机器学习、图论等。无论你是数学建模的初学者还是经验丰富的研究者,这些算法都能...

gitblog_09819的博客 1128

组合数学

题目描述 为了提高智商,ZJY开始学习组合数学。某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝。每次从左上角出发,只能往右或下走。问至少要走几次才可能把财宝全捡完。 但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至多只能捡走一块财宝,其他条件不变,至少要走几次才可能把财宝全捡完? 这次她不会做了,你能帮帮她吗? 输入输出格...

weixin_30684743的博客 273

数学建模算法概述:从理论到实践的应用

数学建模算法是解决实际问题的强大工具。从线性规划到粒子群优化,不同的算法适用于不同类型的问题。

一名南理普通本科生的博客 2170

9.30 组合数学

/ 欧拉定理求逆元。用数学公式快速算出类似杨辉三角加权求和的结果,核心是解决计算中除法和末尾0的问题。// 分离质因子 2,计算 2 的幂次。// 分离质因子 5,计算 5 的幂次。// 计算组合数,需要计算阶乘及其逆元。预处理阶乘、逆元及质因子幂次。组合数计算数组的“三角形和”

No Game No Life 437
上一篇: 实用算法实践-第 29 篇 计算几何学
下一篇: 实用算法实践-第 31 篇 博弈游戏
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值