【问题描述】

小美今天对于数列很有兴趣。小美打算找出一些漂亮的序列。一个漂亮的序列的限制如下:

  1. 长度为 n ,而且数列里只包含 [1,n] 的整数。
  2. 要不是不降的序列就是不升的序列。

小美想知道有多少个合法的序列满足要求。

【输入格式】

从文件 pretty.in 中读入数据。

第一行一个正整数 n 表示数列的大小。

【输出格式】

输出到文件 pretty.out 中。

第一行输出一个数字表示答案。由于这个数字会很大,你需要输出他

模 1000000007 。

【样例】

【样例输入】

2

【样例输出】

4

【样例输入】

3

【样例输出】

17

【题目来源】

CF 57C

题解

首先,看到这样的问题,我们想到这应该是道dp。

我们设\(f[i][j]\)表示前\(i\)个数到达最后一位是\(j\)的递增序列的方案数,则不难根据对称性得出答案为\(2\sum_{i=1}^{n}f[n][i]-n\),减\(i\)是为了减去递增和递减都包含的情况(即全部相同的请况,那显然是\(i\))。

我们发现\(f[i][j]\)的状态由所有\(f[i-1][k](k\le j)\)的状态在结尾加上\(k\)转移过来。故转移方程为:\(f[i][j] = \sum_{k=1}^{j}f[i-1][k]\)。

于是暴力程序就打出来了,那么让我们打张表:

#include <cstdio>

const int n = 10;

int f[n+1][n+1];

int main()
{
freopen("biao.out", "w", stdout);
int ans;
for(int i = 1; i <= n; ++i)
f[1][i] = 1;
for(int i = 2; i <= n; ++i)
{
ans = 0;
for(int j = 1; j <= n; ++j)
for(int k = 1; k <= j; ++k)
f[i][j] = f[i][j] + f[i-1][k];
for(int j = 1; j <= i; ++j)
ans = ans+f[i][j];
}
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
printf("%5d ", f[i][j]);
puts("");
}
}

biao.out

    1     1     1     1     1     1     1     1     1     1
1 2 3 4 5 6 7 8 9 10
1 3 6 10 15 21 28 36 45 55
1 4 10 20 35 56 84 120 165 220
1 5 15 35 70 126 210 330 495 715
1 6 21 56 126 252 462 792 1287 2002
1 7 28 84 210 462 924 1716 3003 5005
1 8 36 120 330 792 1716 3432 6435 11440
1 9 45 165 495 1287 3003 6435 12870 24310
1 10 55 220 715 2002 5005 11440 24310 48620

一看发现:这不是杨辉三角吗?

于是毫不犹豫地打了个\(n^2\),然后就T飞了。

竟然没想到\(\sum_{i=1}^{n}f[n][i] = f[n+1][n] = C^{n}_{2n}\)(可以直接推,也可以看作是在序列结尾加一个\(n\)进行限制)。

于是答案就变成了\(2C^n_{2n}-n\)。取模要求逆元,用费马小定理做一下,总时间复杂度为\(O(n)\)。

当然,杨辉三角也是可以直接推出来的:

\[f[i][j] = \sum_{k=1}^{j}f[i-1][k] = f[i-1][j] + \sum_{k=1}^{j-1}f[i-1][k] = f[i-1][j] + f[i-1][j-1].
\]

以下是我的代码(由于模拟赛加了文件读入输出):

#include <fstream>

using namespace std;

typedef long long LL;

ifstream fin("pretty.in");
ofstream fout("pretty.out"); inline LL pow(LL x, LL y, LL mod)
{
LL ans = 1;
for(; y; y >>= 1, x = (x*x)%mod)
if(y & 1)
ans = (ans*x) % mod;
return ans % mod;
} const LL mod = 1000000007;
const int maxn = 100005; LL fac[maxn<<1]; int main()
{
LL n;
fin >> n;
fac[0] = 1;
for(int i = 1; i <= (n<<1); ++i)
fac[i] = fac[i-1] * i % mod;
fout << (fac[n<<1]* pow(fac[n]*fac[n]%mod, mod-2, mod)) % mod - n << endl;
return 0;
}

20180519模拟赛T2——pretty的更多相关文章

  1. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  2. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  3. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  4. 20180530模拟赛T2——绀碧之棺

    题目背景 qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n ...

  5. 2019.11.11 模拟赛 T2 乘积求和

    昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...

  6. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  7. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  8. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  9. 字符串模拟赛T2

    // source code from laekov for c0x17 #define PRID "fkqh" #include <cstdio> #include ...

随机推荐

  1. HP Client Security Manager

    HP Client Security Manager - SP77916   操作系统:windows 10 64位   HP Client Security Manager - SP77916.ex ...

  2. osx或windows系统下,用ftp上传文件到阿里云虚拟主机脚本

    某天突然发现,一直在用的ftp工具并不好用,操作界面太过繁琐,而且不太稳定.于是自己找资料,整合了几句虽然简单,但是方便的代码. mac脚本 #从本地向FTP批量上传文档 需要赋予该.shell文件权 ...

  3. CentOS忘记密码修改方案以及centos卡在开机登录界面,命令失效的解决方法

    CentOS忘记密码修改方案 应用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于CentOS7.2环境进行操作的,由于CentOS的版本之间是有差异的,继续之前请先确定 ...

  4. storm 介绍+八种grouping方法

    Storm主要的应用场景就是流式数据处理,例如实时推荐系统,实时监控系统等. storm中的相关概念 在storm中,分布式的计算结构指的是一个topology(拓扑),一个topology由流式数据 ...

  5. C基本语法

    分号 ; 在C程序中,分好是语句结束符,每个语句必须以分好结束,它表明一个逻辑实体的结束 例如: printf("Hello, World! \n"); ; 注释 // 单行注释 ...

  6. play framework + sbt入门之环境搭建

    一 sbt的使用 SBT = (not so) Simple Build Tool,是scala的构建工具,与java的maven地位相同.其设计宗旨是让简单的项目可以简单的配置,而复杂的项目可以复杂 ...

  7. 7、VUE事件

    1.事件处理 Vue.js使用v-on指令监听DOM事件来触发JS回调函数. V-on: 缩写为 @ 事件回调函数可以传入$event这个事件对象. 2.事件修饰符 在事件处理程序中调用event.p ...

  8. 使用SqlConnectionStringBuilder构造数据库连接字符串

    在实际开发过程中,很多时候会拷贝一个现有的数据库连接字符串,修改对应的数据库名.用户名.密码等配置成新的数据库连接字符串.但是有时候我们需要增加一些额外的配置,比如超时时间,最大连接池等,此时我们可以 ...

  9. Java 数组(三)二维数组

    如果一维数组的各个元素仍然是一个数组,那么它就是一个二维数组.二维数组常用于表示表,表中的信息以行和列的形式组织,第一个下标代表元素所在的行,第二个下标代表所在的列. 一.二维数组的创建 1.先声明, ...

  10. CSRF漏洞的挖掘与利用

    0x01 CSRF的攻击原理 CSRF 百度上的意思是跨站请求伪造,其实最简单的理解我们可以这么讲,假如一个微博关注用户的一个功能,存在CSRF漏洞,那么此时黑客只需要伪造一个页面让受害者间接或者直接 ...