51nod1556 计算(默慈金数)
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)={{(2n+3)M(n)+3nM(n-1)}\over n+3}$$
\]
有较好英文水平姿势的同学可以参考推导极其生成函数(反正我是不可能会的),考场上我觉得只要会\(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 计算(默慈金数)的更多相关文章
- 51 Nod 1556计算(默慈金数的应用)
#include<bits/stdc++.h> #define mod 1000000007 using namespace std; typedef long long ll; ll m ...
- hdu5673 Robot 卡特兰数 / 默慈金数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5673 分析: 这道题是一道裸的默慈金数,比较容易想到的是用卡特兰数来做.不了解的可以先学习一下. 卡特 ...
- HDU5673 Robot 默慈金数
分析: 注:然后学了一发线性筛逆元的姿势 链接:http://blog.miskcoo.com/2014/09/linear-find-all-invert #include<iostream& ...
- hdu-5673 Robot(默次金数)
题目链接: Robot Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 ...
- 51nod1556 计算
ans[n]=ans[n-1]*3-m[n-2];YY一下可以懂的.减掉的就是往下走的情况不符合正整数的情况.m是默慈金数. #include<cstdio> #include<cs ...
- Python 素数判断;以及默尼森数
1. 素数/质数 只能被2或者本身整除的正整数. 2. 默尼森数 P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森数. 编程小要求: 输出前5个默尼森数 1)最外层循环找素数 中间层循 ...
- python计算文件的行数和读取某一行内容的实现方法
一.计算文件的行数 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了:count = len(op ...
- js计算字符串的字节数和字符串与二进制的相互转化
一.js计算字符串的字节数方法: //blob获取字符串的字节 var debug = "好的"; var blob = new Blob([debug],{type : 'tex ...
- 【转载】python计算文件的行数和读取某一行内容的实现方法
一.计算文件的行数 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: count = len(o ...
随机推荐
- Eclipse常用快捷键速记
补充 15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 ...
- jQuery从小白开始---初始jQuery
jQuery是什么? jQuery是一款优秀的JavaScript库,从命名可以看出jQuery最主要的用途就是用来做查询(jQuery=js+Query),正如jQuery官方Logo副标题所说(w ...
- 剑指前端(前端入门笔记)——Date类型
Date类型 ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC(国际协调时间)1970年1月1日午夜(零时)开始经过的 ...
- java工作流引擎证照库类型的流程设计 实现方案与演示案例
关键词:.Net开源工作流 工作流引擎 工作流引擎常用信息存储 流程前置导航 证照库的概念&应用场景: 我们在梳理流程的时候,会发现有一些流程的发起是基于一个实体信息的. 比如:纳 ...
- 关于写作那些事之利用 js 统计各大博客阅读量
在日常文章数据统计的过程中,纯手动方式已经难以应付,于是乎,逐步开始了程序介入方式进行统计. 在上一节中,探索利用 csv 文件格式进行文章数据统计,本来以为能够应付一阵子,没想到仅仅一天我就放弃了. ...
- ext组件的查询方式
1.使用id进行查询 (1)Ext.ComponentQuery.query("#mypanel") (2)Ext.getCmp("mypanel") 2.根据 ...
- nginx+uwsgi部署django项目
1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...
- javafx:JavaFX Scene Builder 2.0打开含有第三方jar包的fxml文件报错 Caused by: java.lang.ClassNotFoundException
报错如下: java.io.IOException: javafx.fxml.LoadException: /C:/User.................test.fxml at com.orac ...
- Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器
我们知道,docker能实现应用打包隔离,实现快速部署和迁移.如果我们开发应用使用了spring cloud + spring boot架构,那么,通过docker-maven-plugin实现快速构 ...
- 【Spring Cloud笔记】 断路器-hystrix
在微服务架构中,一个微服务的超时失败可能导致瀑布式连锁反映,Spring Cloud Netflix 的断路器Hystrix通过自主反馈,防止了这种情况发生.下面介绍简单的断路器使用方法. [step ...