[题解]第十一届北航程序设计竞赛预赛——F.序列
题目描述
(1,……,n)的一个排列S,定义其对应的权值F[S]为:将S划分为若干段连续子序列,每个子序列都是上升序列,F[S]的值等于能划分出的最小段数。
求n的全排列的F[S]的和,答案mod(10^9+7)。
解题思路
刚拿到题目时,我没什么思路,于是决定列举情况找找规律。
当n == 1时,F[1] = 1,结论是平凡的。
当n == 2时,全排列如下:
(1,2):1个子序列
(2,1):2个子序列
可以得出F[2] = 3。
当n == 3时,考虑在n == 2的情况下插入数字3。
(1)将3插入到第一个位置,得到排列:
(3,1,2):2个子序列
(3,2,1):3个子序列
相比插入前,每个排列的序列数+1。
(2)将3插入到第二个位置,得到排列:
(1,3,2):2个子序列
(2,3,1):2个子序列
相比插入前,1个排列的序列数+1,1个排列的序列数不变。
(3)将3插入到第三个位置,得到排列:
(1,2,3):1个子序列
(2,1,3):2个子序列
相比插入前,每个排列的序列数不变。
综上,可以得出F[3] = 12。
当n==4时,与之前相似的思路,插入数字4。
(1)将4插入到第一个位置,得到排列:
(4,3,1,2):3个子序列
(4,3,2,1):4个子序列
(4,1,3,2):3个子序列
(4,2,3,1):3个子序列
(4,1,2,3):2个子序列
(4,2,1,3):3个子序列
相比插入前,每个排列的序列数+1。
(2)将4插入到第二个位置,得到排列:
(3,4,1,2):2个子序列
(3,4,2,1):3个子序列
(1,4,3,2):3个子序列
(2,4,3,1):3个子序列
(1,4,2,3):2个子序列
(2,4,1,3):2个子序列
相比插入前,3个排列的序列数+1,3个排列的序列数不变。
(3)将4插入到第三个位置,得到排列:
(3,1,4,2):3个子序列
(3,2,4,1):3个子序列
(1,3,4,2):2个子序列
(2,3,4,1):2个子序列
(1,2,4,3):2个子序列
(2,1,4,3):3个子序列
相比插入前,3个排列的序列数+1,3个排列的序列数不变。
(4)将4插入到第四个位置,得到排列:
(3,1,2,4):2个子序列
(3,2,1,4):3个子序列
(1,3,2,4):2个子序列
(2,3,1,4):2个子序列
(1,2,3,4):1个子序列
(2,1,3,4):2个子序列
相比插入前,每个排列的序列数不变。
综上,可以得出F[4] == 60。
这时我们可以发现:F[n + 1] = (F[n] + n!) + (F[n] + n!/2) + ……+ (F[n] + n!/2) + (F[n]) = (n + 1) * F[n] + (n + 1)!/2
即:F[n] = (n + 1)!/2
在比赛现场我没有证明,但根据上述思路,可以利用排列组合给出简单的证明。
于是问题转化为求阶乘除以2后模大数取余。
这里用到了同余的性质:
(1)x≡a(mod m)且y≡b(mod m),则x+y≡a+b(mod m);
(2)x≡a(mod m)且y≡b(mod m),则x-y≡a-b(mod m);
(3)x≡a(mod m)且y≡b(mod m),则xy≡ab(mod m)。
所以我们想到,(n + 1)!可以每乘以一个因子就取一次模。这里有个很重要的细节,同余对除法没有这么好的性质,不能算完(n + 1)! mod 10^9+7后再除以2,这样答案是错误的。所以我们采用一开始就除以二的方式开始计算。
附:c++代码
1 #include <iostream>
2 #include <cstdio>
3
4 using namespace std;
5 #define MOD 1000000007LL
6 #define MaxN 100020
7
8 typedef long long llt;
9
10 llt J[MaxN];
11
12 inline void Get_J()
13 {
14 llt i;
15 J[0] = J[1] = 1;
16 J[2] = 1;
17 for(i = 3; i <= 100001; i++)
18 J[i] = (J[i - 1] * i) % MOD;
19 }
20
21 int main()
22 {
23 llt i, n;
24 // ans;
25 //llt N = 1;
26 //J[0] = J[1] = 1;
27 Get_J();
28 while(scanf("%lld", &n) != EOF)
29 {
30 //ans = J[n + 1] / 2;
31 printf("%lld\n", J[n + 1]);
32 }
33 return 0;
34 }
另一种思路
这是官方给出的题解。
对于一个固定的排列p,权值为。所以相邻两个数字,如果前面数字大于后面数字则对答案贡献1。
公式:。
题目链接:https://biancheng.love/contest-ng/index.html#/29/problems
[题解]第十一届北航程序设计竞赛预赛——F.序列的更多相关文章
- [题解]第十一届北航程序设计竞赛预赛——D.最大公约数
题目描述 给一个长度为n(1<=n<=100000)的正整数列,分成尽量多的非空段,使得每一段的最大公约数相等.一个数的最大公约数是它本身. 解题思路 要求每一段子列的gcd相等,不妨设为 ...
- [题解]第十一届北航程序设计竞赛预赛——L.偶回文串
题目描述 长度为偶数的回文串被称为偶回文串.如果一个字符串重新排序之后能够成为一个偶回文串,则称为可回文的. 给一个字符串,求可回文的子串个数.字符串只含小写字母,单个字符串长度不超过10^5,所有数 ...
- [题解]第十一届北航程序设计竞赛预赛——I.神奇宝贝大师
题目描述 一张n*m的地图,每个格子里面有一定数量的神奇宝贝,求一个最优位置,使得所有神奇宝贝到该位置的曼哈顿距离最小. 一共有T组数据,每组数据包含两行,第一行是n和m(1<=n,m<= ...
- [题解]第十一届北航程序设计竞赛预赛——H.高中数学题
题目描述 解题思路 可以求得通项公式:an = 2n + 1,所以问题就变成等差数列求异或和,这个具体为什么对我还不能很好地解释清楚,先挖坑吧. 附:c++代码 1 #include <iost ...
- [题解]第十一届北航程序设计竞赛预赛——A.模式
题目描述 输入一个学号,判断是计算机系or软件学院or其他院系. 解题思路 水题,直接判断or除以10000都可以.不废话,直接上代码. 1 #include <iostream> 2 # ...
- B P5 第十三届北航程序设计竞赛预赛
https://buaacoding.cn/contest-ng/index.html#/188/problems 其实这题挺简单的. 注意到答案的大小最多是22 二分,check长度是mid的不同子 ...
- 北京师范大学第十六届程序设计竞赛决赛 F 汤圆防漏理论
链接:https://www.nowcoder.com/acm/contest/117/F来源:牛客网 汤圆防漏理论 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...
- 湖南省第十一届大学生程序设计竞赛:Internet of Lights and Switches(HASH+二分+异或前缀和)
Internet of Lights and Switches Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][ ...
- 第十二届北航程序设计竞赛决赛网络同步赛 B题 前前前世(数论推导 + DP)
题目链接 2016 BUAA-Final Problem B 考虑一对可行的点$(x, y)$ 根据题意,设$x = ak + 1,y = bk + 1$ 又因为$x$是$y$的祖先的祖先的祖先,所 ...
随机推荐
- 【刷题-LeetCode】122 Best Time to Buy and Sell Stock II
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- Java 异步 I/O
Java 中的异步 I/O 简称 AIO, A 即 Asynchronous.AIO 在 JDK1.7 时引入,基于操作系统提供的异步 I/O 通信模型,封装了一些进行异步 I/O 操作的 API. ...
- manjaro20安装TIM
安装 yaourt -S deepin-wine-tim 失败 yaourt -S deepin.qq.office 成功,但是tim版本没有待办,版本比较旧. 配置分辨率 https://blog. ...
- Cesium中级教程1 - 空间数据可视化(一)
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 本教程将教读者如何使用Cesium的实体(Entity)API绘 ...
- golang中map原理剖析
1. golang中的map有自己的一套实现原理,其核心是由hmap和bmap两个结构体实现的 2. 初始化map package main func main() { // 初始化一个可容纳10个 ...
- collate utf8_bin是什么意思
创建数据库时 collate utf_bin是 以二进制值比较,也就是区分大小写,collate是核对的意思 uft-8_general_ci 一般比较,不区分大小写
- Typora破解
Typora破解 需要python环境,没有的话需要先安装一下 访问 https://github.com/Mas0nShi/typoraCracker.git下载下来破解需要的压缩包并且解压缩 或者 ...
- GAN入门
1 GAN基本概念 1.1 什么是生成对抗网络? 生成对抗网络(GAN, Generative adversarial network) 在 2014 年被 Ian Goodfellow 提出. GA ...
- springmvc 配置拦截器
package com.aaa.zxf.interceptor; import org.springframework.boot.autoconfigure.SpringBootApplication ...
- ApacheCN 人工智能知识树 v1.0
贡献者:飞龙 版本:v1.0 最近总是有人问我,把 ApacheCN 这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间.但我觉得这是非常麻烦的,因为每本书的内容大部分是重复的, ...