Problem

有一个\(1*n\)的矩阵,固定第一个数为\(1\),其他填正整数, 且相邻数的差不能超过\(1\),求方案数。

\(n\le 10^6\)

Solution

容易发现答案是\(f_n=f_{n-1}*3-g_{n}\)。

其中\(g_i\)表示从\((0,0)\)走到\((i,0)\)可以向上,向下向右走一格,但是只能在第一象限的方案数。

然后这个显然可以用 组合数 + 卡特兰数 推一波:$$\sum_{i=1}^{\frac{n}{2}}\binom{n}{2i}Catalan_{i}$$但时间复杂度是\(O(n^2)\)的。

然后去学了一发姿势,发现这个是所谓的默慈金数

一个给定的数\(n\)的默慈金数是:

  • 在一个圆上的\(n\)个点间,画出彼此不相交的弦的方案数

其中,\(M(1)=1,M(2)=2\)

\[M(n+1)=M(n)+\sum_{i=0}^{n-1}M(i)*M(n-1-i)
\]

可以推导出$$M(n+1)={{(2n+3)M(n)+3nM(n-1)}\over n+3}$$

\[M(n)={{(2n+1)M(n-1)+(3n-3)M(n-2)}\over n+2}
\]

有较好英文水平姿势的同学可以参考推导极其生成函数(反正我是不可能会的),考场上我觉得只要会\(O(n^2)\)的方法,然后只需知道它是由\(n-1,n-2\)推到\(n\),找一下规律应该可以。。。

http://mathworld.wolfram.com/MotzkinNumber.html

http://www.docin.com/p1-964777006.html

Code
#include <bits/stdc++.h>

#define F(i,a,b) for (int i = a; i <= b; i ++)

using namespace std;

const int N = 1e6 + 10;
const int Mo = 1e9 + 7; long long f[N], M[N], n; int ksm(int x, int y) {
int ans = 1;
for (; y ; y >>= 1, x = (1ll * x * x) % Mo)
if (y & 1)
ans = (1ll * ans * x) % Mo;
return ans;
} int main() {
scanf("%d", &n); f[1] = 1, f[2] = 2;
M[1] = 1, M[2] = 2;
F(i, 3, n) {
M[i] = ((2 * i + 1) * M[i - 1] + (3 * i - 3) * M[i - 2]) % Mo * ksm(i + 2, Mo - 2) % Mo;
f[i] = (f[i - 1] * 3 - M[i - 2]) % Mo;
} printf("%d\n", (f[n] + Mo) % Mo);
}

51nod1556 计算(默慈金数)的更多相关文章

  1. 51 Nod 1556计算(默慈金数的应用)

    #include<bits/stdc++.h> #define mod 1000000007 using namespace std; typedef long long ll; ll m ...

  2. hdu5673 Robot 卡特兰数 / 默慈金数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5673 分析: 这道题是一道裸的默慈金数,比较容易想到的是用卡特兰数来做.不了解的可以先学习一下. 卡特 ...

  3. HDU5673 Robot 默慈金数

    分析: 注:然后学了一发线性筛逆元的姿势 链接:http://blog.miskcoo.com/2014/09/linear-find-all-invert #include<iostream& ...

  4. hdu-5673 Robot(默次金数)

    题目链接: Robot Time Limit: 12000/6000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) 问题描述 ...

  5. 51nod1556 计算

    ans[n]=ans[n-1]*3-m[n-2];YY一下可以懂的.减掉的就是往下走的情况不符合正整数的情况.m是默慈金数. #include<cstdio> #include<cs ...

  6. Python 素数判断;以及默尼森数

    1. 素数/质数 只能被2或者本身整除的正整数. 2. 默尼森数 P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森数. 编程小要求: 输出前5个默尼森数 1)最外层循环找素数 中间层循 ...

  7. python计算文件的行数和读取某一行内容的实现方法

    一.计算文件的行数 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了:count = len(op ...

  8. js计算字符串的字节数和字符串与二进制的相互转化

    一.js计算字符串的字节数方法: //blob获取字符串的字节 var debug = "好的"; var blob = new Blob([debug],{type : 'tex ...

  9. 【转载】python计算文件的行数和读取某一行内容的实现方法

    一.计算文件的行数 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: count = len(o ...

随机推荐

  1. vue-router 用户登陆

    有些路由页面需要用户登陆之后才能访问如(用户中心),如果用户没有登陆就访问这些页面的话就应该转换到登陆页面,登陆成功之后在进入该页面. 需要用到的知识点有:H5中的会话存储(sessionStorag ...

  2. Gulp 前端优化

    使用方法: 下载 node.js , https://nodejs.org/en/,并安装 msi 一下命令都属于 dos 命令 node -v,npm -v,检验是否下载成功(出现版本号) 将 np ...

  3. solr8.0 从数据库导入数据(三)

    第一步:导入相关包: 在创建的核心目录下新建lib文件夹(如果有,无需建立),从Solr源码包的dist文件夹中导入两个solr-dataimporthandler包,以及一个mysql驱动包. 第二 ...

  4. 小米平板8.0以上系统如何不用root激活xposed框架的流程

    在大多使用室的引流,或业务操作中,基本上都需要使用安卓的强大XPOSED框架,近来我们使用室购来了一批新的小米平板8.0以上系统,基本上都都是基于7.0以上系统版本,基本上都不能够刷入ROOT的su权 ...

  5. 随笔:关于去年的WordPress建站的回忆

    2018-02-26    建站 2018-02-28    选择主题Clearision 2018-03-01    学习插入视频.修改主题 <iframe src="//playe ...

  6. Spark 基本函数学习笔记一

      Spark 基本函数学习笔记一¶ spark的函数主要分两类,Transformations和Actions. Transformations为一些数据转换类函数,actions为一些行动类函数: ...

  7. 在xp下无人值守自动安装系统

    无人值守安装可以大大缩短安装系统的时间.我在虚拟机测试成功. 先给文件链接https://files.cnblogs.com/files/sishenzaixian/%E8%87%AA%E5%8A%A ...

  8. C#二维码与条形码的生成

    二维码 using Gma.QrCodeNet.Encoding;using Gma.QrCodeNet.Encoding.Windows.Render; string str = "Htt ...

  9. MYSQL的information_schema数据库中你可以得到的信息!!!

    1.COLUMNS 记录了所有表字段的一些基本信息,例如权限信息等. 2:TABLES :使用该表可以查询每一个表的详细信息,例如数据占用空间大小.索引大小以及表的更新时间以及表的行数等 3:视图 可 ...

  10. oracle 基础查询语句

    select abs(10) from dual; --取绝对值select ceil(3.6) from dual;--向上取整 select power(2,3) from dual;--2的3次 ...