组合数学

hdu2045 不容易系列三——LELE的RPG难题 (递推方程)

点点圈 提交于 2020-11-10 07:55:33
本文出自: blog.csdn.net/svitter 原题: http://acm.hdu.edu.cn/showproblem.php?pid=2045 题意:中文不用我说了吧。 这个题目的关键就在于递推方程——以及错误的测试数据 首先这个题目就是简单的置换群着色问题—— 去除了反转的问题,难一点的大家可以看P197(离散数学,高等教育出版社) 我在做这个题目的时候首先被f [ 1 ] = 3 困扰了。。拜托,根本不符合题意好吗- =一个格子能说是首尾颜色不同吗? 后来写错了递推方程——f [ n ] = f [ n - 1 ] + 3 * f [ n - 2 ],把 f [ n - 1 ] 的情况多考虑了一遍- = 。 正确的方程应该是 —— f [ n ] = f [ n - 1 ] + 2 * f [ n - 2 ] , n >= 4; (去除了f [ 1 ] = 3 这个坑爹的干扰。) 写成lln是为了防止超范围——写完以后记得DEBUG一下看看有没有超范围—— 代码: #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define lln long long int lln f[51]; void ace() { memset(f, 0x3f, sizeof(f

组合数学实验——从逆序列构造一个排列

笑着哭i 提交于 2020-04-15 15:40:19
【推荐阅读】微服务还能火多久?>>> 同前几篇博客 算法:组合数学中文第4版 机械工业出版社 P59 ////////////////////////////////////////////// // // // Project Name: converse // // // // File Name: converse.h // // // // Author: Victor Zhang // // // // ID: 21*****92 // // // // Create Date: March 30. 2009 // // // ////////////////////////////////////////////// #include <fstream> #ifndef CONVERSE_H #define CONVERSE_H #define MAXLEN 90000 class Converse { private: int data[MAXLEN][2]; int count; public: Converse(int = 0); ~Converse() { int i = 0; count = 0; for (i = 0; i < MAXLEN; i++) { data[i][1] = data[i][0] = 0; }; }; void Initialize

组合数学实验——二分图匹配算法

不羁岁月 提交于 2020-04-15 15:39:56
【推荐阅读】微服务还能火多久?>>> 大一时候写的代码,忽然翻了出来.... 算法:组合数学中文第4版 机械工业出版社 P234 ID就先隐藏掉了 ////////////////////////////////////////////// // // // Project Name: matching // // // // Author: Victor Zhang // // // // ID: 21*****92 // // // // Create Date: March 31. 2009 // // // ////////////////////////////////////////////// #include <iostream> #include <iomanip> using namespace std; struct Node { int i;//col int j;//row int tag;//-1='*', 0=Empty, -2=Locked int link;//-1=Empty, 0=Locked bool flag;//search flag Node* down; Node* right; }; class Graph { private: Node* head; int row; int col; int num; bool

组合数学实验——生成{1,2,……,n}的排列的算法

只愿长相守 提交于 2020-04-15 15:39:22
【推荐阅读】微服务还能火多久?>>> 同前几篇博客 算法:组合数学中文第4版 机械工业出版社 P57 这个版本好像小范围发布过,这么多注释...... ////////////////////////////////////////////// // // // Project Name: Permutation // // // // File Name: permutation.h // // // // Author: Victor Zhang // // // // ID: 21*****92 // // // // Create Date: March 23. 2009 // // // ////////////////////////////////////////////// #include <iostream> using namespace std; #ifndef PERMUTATION_H #define PERMUTATION_H struct unit//定义元素结构 { unit* pre;//指向前驱元素的指针 bool arrowLeft;//元素箭头指向 int value;//元素的值 unit* next;//指向后继元素的指针 }; class Permutation_usr { private: unit* head;//链表头地址

组合数学

放肆的年华 提交于 2020-04-03 11:40:46
二项式反演 \[f(n)=\sum^{n}_{i=0}(-1)^iC^i_ng(i)<->g(n)=\sum^n_{i=0}(-1)^iC^i_nf(i) \] \[f(n)=\sum^n_{i=0}C^i_ng(i)<->g(n)=\sum^n_{i=0}(-1)^{n-i}C^i_nf(i) \] 第二类斯特林数 \(S^m_n\) 表示的是把 \(n\) 个不同的小球放在 \(m\) 个相同的盒子里方案数。 盒子不能为空 也可以表示 \(S^m_n=\{^n_m\}\) \[S^m_n=S^{m-1}_{n-1}+mS^m_{n-1} \] 性质: \[n^m=\sum^m_{i=0}S^i_m*i!*C^i_n \] 理解:左边是 \(m\) 个球可以任意放在 \(n\) 个盒子里的答案 右边就是枚举有多少个盒子空着,然后组合数枚举一下。最后因为盒子不同所以要乘一个 \(i!\) 通项公式: 设 \(f(n)=n^m,g(i)=S^i_m*i!\) 反演一下 \[S^n_m*n!=\sum^n_{i=0}i^m*(-1)^{n-i}*C^i_n \] \[\to S^n_m=\sum^n_{i=0}\frac{(-1)^{n-i}*i^m}{i!*(n-i)!} \] 求法:发现是卷积形式,直接 \(NTT\) 与自然数幂的关系 \[sum(n)=\sum^n_{i=0}i

C#实现排列组合算法

大兔子大兔子 提交于 2020-03-18 06:13:03
数学中排列组合,排列P(N,R) 其实排列实现了,组合也就实现了组合C(N,R)就是P(N,R)/P(R,R) ,比较简单的是递归算法,但考虑到递归的性能,下面采用了2种非递归的方法,代码如下 view plain copy to clipboard print ? using System; using System.Collections.Generic; namespace Test { class Program { static void Main( string [] args) { Console.WriteLine(P1(6, 3)); Console.WriteLine(P2(6, 3)); Console.WriteLine(C(6, 2)); } /// <summary> /// 排列循环方法 /// </summary> /// <param name="N"></param> /// <param name="R"></param> /// <returns></returns> static long P1( int N, int R) { if (R > N || R <= 0 || N <= 0 ) throw new ArgumentException( "params invalid!" ); long t = 1; int i = N;

UVA.10325 The Lottery (组合数学 容斥原理 二进制枚举)

人走茶凉 提交于 2020-03-12 00:00:08
UVA.10325 The Lottery (组合数学 容斥原理) 题意分析 首先给出一个数n,然后给出m个数字(m<=15),在[1-n]之间,依次删除给出m个数字的倍数,求最后在[1-n]之间还剩下多少个数字(包括1和n),已知m个数字中不会包含1(否则全部都被刷掉了)。 前置技能 1. 给出数字s,在[1-n]之间,s的倍数有n/s个。 2. 给出数字s1,和s2,在[1-n]之间,既是s1的倍数,又是s2的倍数,有n/lcm(s1,s2)个. 3. 给出数字s1,s2……sk(共k个数字),在[1-n]之间,既是s1也是s2……也是sk的倍数,有n/lcm(s1,s2,s3……sk)个。 4. 结论3在si两两互质的情况下,有n/(s1* s2 * s3…… * sk)个。 5. 容斥定理 用容斥定理能求出来,s1,s2,s3……sk的倍数在[1,n]中共有多少各个,然后用n减去即可。 或者利用奇增偶减的规则,一次性枚举完也可以。 代码总览 #include <cstdio> #include <algorithm> #include <cstring> #define nmax 20 #define ll long long using namespace std; ll initnum[nmax]; ll n; int m; ll gcd(ll a, ll b) {

组合数学总结

限于喜欢 提交于 2020-03-05 19:59:14
问题 E: 【排列组合问题】Jam的计数法 题目描述 囚犯之间的秘密交流使用一种被称为Jam的计数法,这种计数法不使用阿拉伯数字计数,而是使用小写英文字母计数,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。在 Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam计数法还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f, g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果用U、V依次表示 Jam数字“bdfij”与“bdghi”,则U<V,且不存在Jam数字P,使U<P<V)。作为联络员的邪狼,他的任务是:对于从文件读入的一个 Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。 输入 有2行,第1行为3个正整数,用一个空格隔开:s t w(其中,s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<t≤26,2≤w≤t-s ) 第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。 输出 最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个

(1)组合数学--幻方

瘦欲@ 提交于 2020-02-28 18:20:10
幻方: 对角线,每一行,每一列加起来都相等 幻和: 每一行或列或对角线数字的和 1+2+3+…+n 2 = n 2 (n 2 + 1)/2 所以每一行的和为n(n 2 + 1)/2 构造幻方: 奇数阶幻方:连续摆放法 双偶数阶(4k)幻方:对称法 单偶数(4k+2)幻方:斯特雷奇法 连续摆放法: 摆1在第一行第(n+1)/2列 行号-1,列号+1摆放 有了数字或者到了第0行第n+1列对应的方格,推到前一个放个正下方的方格. 对称法(n=4k): 在左上2k*2k的方块中,每行每列中都涂k个阴影.对称到其他三个方块中,然后正着从1填到n 2 中,有阴影跳过,之后再从倒着从1填到n 2 只填阴影 (4k+2)幻方斯特雷奇法: 将方块分为四个小块,左上为A,右下为B,左下为D,右上为C 按照连续摆放法将数据填进ABCD中 AD交换:从每行取k列交换,但中间一行从第二列开始数 BC交换:从右到左每行取k-1个方格交换 幻方的计数问题 3阶幻方只有一种 来源: CSDN 作者: 人总是要有梦想的QAQ 链接: https://blog.csdn.net/qq_43410618/article/details/104554102

POJ3252——Round Number(组合数学)

余生颓废 提交于 2020-02-24 23:16:42
Round Numbers Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets to be milked first. They can't even flip a coin because it's so hard to toss using hooves. They have thus resorted to "round number" matching. The first cow picks an integer less than two billion. The second cow does the same. If the numbers are both "round numbers", the first cow wins, otherwise the second cow wins. A positive