【NOIP2017模拟8.7】好的排列

Description

对于一个1->n的排列 ,定义A中的一个位置i是好的,当且仅当Ai-1>Ai 或者Ai+1>Ai。对于一个排列A,假如有不少于k个位置是好的,那么称A是一个好的排列。
现在有q个询问,每个询问给定n,k,问有多少排列是好的。答案对10^9+7取模。

Input

输入文件名为permutation.in。
首先输入q。
接下来输入q个询问n,k 。

Output

输出文件名为permutation.out。
输出q行,每行一个整数代表答案。

Sample Input

8
4 3
6 4
10 7
20 14
50 40
100 72
1000 900
3000 2000

Sample Output

8
448
1433856
868137807
908422882
609421284
150877522
216180189

Data Constraint

对于20%的数据,n<=10,q=1
对于40%的数据,n<=20,q=1
对于60%的数据,n<=100
对于100%的数据,n,k<=3000,q<=10000

正难则反,我们可以考虑下“坏数字”(谷峰)($a_{i-1} < a_{i}>a_{i+1}$)。数位动规,数字的位置变换我们可以想象成插入,令F[i][j]表示到第i个数字,此时有j个谷峰的合法插入方案数,则第i个数字如果查到j个坏数字的两侧,则不会产生新的“谷峰”,那么有2*j个位置,F[i][j]*(2*j)-->F[i+1][j],如果插到其他位置,则会产生一个新的“谷峰”(序列两侧可以分别假想有个0),那么有(i-2*j)个位置,F[i][j]*(i-(2*j))-->F[i+1][j+1].初始条件F[1][1]=1,最后$ans=\sum _{i=1}^{n-k}f\left[ n\right] \left[ i\right]$

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #define qaq 1000000007
 6 using namespace std;
 7 int n,k,q;
 8 long long f[3002][3002];
 9 long long ans;
10 int main(){
11     freopen("permutation.in","r",stdin);
12         freopen("permutation.out","w",stdout);
13         f[1][1]=1;
14     for (int i=2;i<=3000;i++)
15      for (int j=1;j<=3000;j++)
16       if (!f[i][j])
17        f[i][j]=f[i-1][j]*(2*j)%qaq+f[i-1][j-1]*(i-2*(j-1))%qaq;
18     scanf("%d",&q);
19     while (q--){
20         scanf("%d%d",&n,&k);;
21          ans=0;
22          for (int i=n-k;i>=1;i--)
23           ans=(ans+f[n][i])%qaq;
24         printf("%lld\n",ans);
25     }
26     return 0;
27 }

神奇的代码

(事实上我们可以预处理n,k到3000的值最后再直接累加即可)

时间: 2024-12-29 01:47:06

【NOIP2017模拟8.7】好的排列的相关文章

冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱

1.二叉树(binary) 1.二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有键值相等的结点. 完全二叉树:只有最下面的两层结点度能够小于2,并且最下面一层的结点 都集中在该层最左边的若干位置的二叉树. 图1中,(a)和(b)是完全二叉树,(c)和(

模拟公交站台竖直排列,两端对齐

今天看到一个公家车站台的公家站牌,对站名的排列方式很有兴趣,html和css没有提供文字竖直排列的简便方法,需要我们利用一些技巧才能完成  大概要的效果就是这样的,竖直排列,两端对齐 首先先对竖直排列进行设计 先上html代码: 1 <ul> 2 <li><b>站牌1</b></li> 3 <li><b>站牌2</b></li> 4 <li><b>长站牌3</b>

JZOJ.5281【NOIP2017模拟8.15】钦点

Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 Sample Output d d c c  d d c c  b b a a  b b a a  Data Constraint 本题时限4s. 很明显这是一道模拟题,朴素算法O(nmq)看似过得去,实际上字符串的操作是很慢的,同样对字符串赋值10w次比对数组元素赋值10w次要慢3倍以上. 实际上

暑假第二次考试 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n-2 个路口,分别标上号,A 农场为 1 号,B 农场为 n 号,路口分别为 2...n-1 号,从 A 农场到 B 农场有很多条路径可以到达,而 CG 发现有的路口是必须经过的,即每条路径都经过的路口,CG 要把它们记录下来,这样 CG 就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口. [输入格式] 第一行两个用空格隔开的

冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱

1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a 行 b 列的铜模,每个位置要么是 0(代表 这个点是平的),要么是 1(代表这个点是凸起的).他们想造 个 n 行 m 列 的鼎 ,其中每个位置也都是 0 或 1,表示经过若干 次印后,每个位置的结果. 有一些要求.铜模是不能旋转和翻转的:在印的过程当中,铜模的凸起不 能出现在鼎面的外面(平的部分是

【NOIP2017模拟8.5】队伍统计

Description 现在有n个人要排成一列,编号为1->n .但由于一些不明原因的关系,人与人之间可能存在一些矛盾关系,具体有m条矛盾关系(u,v),表示编号为u的人想要排在编号为v的人前面.要使得队伍和谐,最多不能违背k条矛盾关系(即不能有超过k条矛盾关系(u,v),满足最后v排在了u前面).问有多少合法的排列.答案对10^9+7取模. Input 输入文件名为count.in.第一行包括三个整数n,m,k.接下来m行,每行两个整数u,v,描述一个矛盾关系(u,v).保证不存在两对矛盾关系

JZOJ.5331【NOIP2017模拟8.23】壕游戏

Description Input Output Sample Input 6 8 2 2 4 5  1 2 4 0 2 1 3 5 0 2 3 4 1 5 1 2 5 1 0 1 4 6 4 2 2 5 6 0 4 2 1 5 5 9 2 2 6 4 5 2 Sample Output 16 Data Constraint Hint 类似于一种可撤销的贪心,不难想到这是费用流的模型. 考虑到我们实际会用到的边比实际的边少很多,我们可以动态建边,以减少空间的使用,即当流过了一条边之后再建立第二次

JZOJ.5274【NOIP2017模拟8.14】数组

Description Input Output Sample Input 输入样例1: 3 2 7 5 4 2 输入样例2: 5 3 1 5 4 3 5 5 Sample Output 输出样例1: 999999732 输出样例2: 0 Data Constraint 这个题要求乘积最小,显然我们希望乘积是负数是最好的,然后就是让这个负数的绝对值尽可能的大. 对于一堆数相乘,绝对值最小的对这个结果影响是最大的,所以我们就每次让绝对值最小的,如果是正数就加上x,负数就减去x,用个优先队列维护绝对

【NOIP2017模拟8.8】Trip

Description 多年之后,worldwideD厌倦竞争,隐居山林.       他的家乡开始发展起了旅游业,在一条很长的主干道上,有N个旅游景点,按顺序编号为1到N.根据游客们网上的评分,第i个景点有一个评估值a[i],为了区分开不同的景点,评估值是两两不同的.       今天有M组游客前来旅游,第i组游客选择遍历景点Li到景点Ri这一段路.他们搜到Li到Ri的所有评估值,如果对于景点j(Li≤j≤Ri),不存在景点x(Li≤x<j)满足a[x]>a[j]或不存在景点y(j<y