[题解]第十一届北航程序设计竞赛预赛——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$的祖先的祖先的祖先,所 ...
随机推荐
- 《剑指offer》面试题65. 不用加减乘除做加法
问题描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"."/" 四则运算符号. 示例: 输 ...
- virtual studio发布到gihub
问题 我们想要发布代码到github或者微软团队服务时候,往往发现没有本地库,所以难以发布. 解决方案 在解决方右击就可以新建git 文件都会出现小锁说明有了记录 文件夹会对应出现 右上角管理连接也会 ...
- rpc基础讲解
什么是RPC 本地过程调用 远程过程调用带来的3个问题 RPC的调用过程 RPC的具体过程如下 总结 RPC.HTTP.Restful之间的区别 通过httpserver实现rpc 首先一点需要明确: ...
- String类-intern方法
1 package cn.itcast.p1.string.demo; 2 3 class StringObjectDemo { 4 public static void main(String[] ...
- Python定制化天气预报消息推送
sansui-Weather 代码码云 介绍 定制化天气预报消息推送(练手小脚本) Python脚本实现天气查询应用,提醒她注意保暖! 功能介绍 天气信息获取 当天天气信息提示 第二天天气信息提示 网 ...
- 什么是VRRP?
目录 一:什么是VRRP? 二:为什么需要VRRP 三:VRRP的工作原理 1.VRRP的三种状态 2.VRRP选举机制 3.VRRP工作原理 四:VRRP的详细工作过程如下: 五:VRRP应用场景 ...
- 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...
- Flink源码学习笔记(2) 基于Yarn的自动伸缩容实现
1.背景介绍 随着实时计算技术在之家内部的逐步推广,Flink 任务数及计算量都在持续增长,集群规模的也在逐步增大,本着降本提效的理念,我们研发了 Flink 任务伸缩容功能: 提供自动伸缩容功能,可 ...
- Vue+webpack配置实现多页面应用开发
为什么要配置多页面开发? · 由于单页面应用不利于SEO,对于某些资讯类网站不够友好,而多页面则能够更优的解决此问题. · 传统的多页面开发模式(如java的jsp等) 前后端耦合性大,开发效率低,代 ...
- python程序语法元素分析
#TemConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in ['F', 'f']: C = (eval(Tem ...