【题目】C. Maximum Element

【题意】给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[j],求长度为n的好的排列数。n<=10^6。

【算法】排列组合+动态规划

【题解】设D(n)表示长度为n且满足a[n]=n的好的排列数,考虑这样的一个排列w。

如果数字n-1的位置j<n-k,那么显然这是一个好的排列。

如果数字n-1的位置j>=n-k,那么位置j前的数字一定<n-1,那么1~j形成好的排列的方案实际上是D(j)。

$$D(n)=(n-k-1)*(n-2)!+\sum_{j=n-k}^{n-1}D(j)*A(n-2,n-j-1)$$

第一部分:数字n-1有n-k-1个位置,每个位置固定后可以进行全排列即(n-2)!

第二部分:枚举数字n-1的位置,固定后后面的n-j-1个位置可以从除了n和n-1的数字中任意取数填满,剩下的数字当成1~j构成D(j)。

化简后得到:

$$D(n)=(n-k-1)*(n-2)!+(n-2)!\sum_{j=n-k}^{n-1}\frac{D(j)}{(j-1)!}$$

边算前缀和即可。

最后,枚举答案中n的位置(因为数字n后面的位置没有意义),那么:

$$ans=\sum_{i=1}^{n}D(j)*A(n-1,n-i)=(n-1)!*\sum_{i=1}^{n}\frac{D(j)}{(j-1)!}$$

复杂度O(n)。

#include<cstdio>
const int maxn=,MOD=1e9+;
int n,k,fac[maxn],fav[maxn],D[maxn],h[maxn];
void gcd(int a,int b,int& x,int& y){if(!b){x=;y=;}else{gcd(b,a%b,y,x);y-=x*(a/b);}}
int inv(int a){int x,y;gcd(a,MOD,x,y);return (x%MOD+MOD)%MOD;}
int main(){
scanf("%d%d",&n,&k);
fac[]=;
for(int i=;i<=n;i++)fac[i]=1ll*fac[i-]*i%MOD,fav[i]=inv(fac[i]);
for(int i=;i<=n;i++)if(i>k){
D[i]=1ll*fac[i-]*((i-k-)+h[i-]-h[i-k-]+MOD)%MOD;
h[i]=(h[i-]+1ll*D[i]*fav[i-])%MOD;
}
printf("%lld",1ll*h[n]*fac[n-]%MOD);
return ;
}

排列组合相关的DP需要记住一件事:1~n的排列代表的是n个数的大小关系的排列,不一定需要1~n,然后就可以很方便地转移了。

【CodeForces】889 C. Maximum Element 排列组合+动态规划的更多相关文章

  1. Codeforces Gym 100187D D. Holidays 排列组合

    D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...

  2. Codeforces 991E. Bus Number (DFS+排列组合)

    解题思路 将每个数字出现的次数存在一个数组num[]中(与顺序无关). 将出现过的数字i从1到num[i]遍历.(i from 0 to 9) 得到要使用的数字次数数组a[]. 对于每一种a使用排列组 ...

  3. CodeForces - 817B(分类讨论 + 排列组合)

    题目链接 思路如下 这一题是:最菜的队伍只有三个人组成,我们只需对排序后的数组的 前三个元素进行分类讨论即可: a[3] != a[2] && a[3] != ar[1] a[3] = ...

  4. UVA 12906 Maximum Score 排列组合

    Maximum Score Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vie ...

  5. codeforces 57 C Array(简单排列组合)

    C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  6. 【CodeForces】914 H. Ember and Storm's Tree Game 动态规划+排列组合

    [题目]H. Ember and Storm's Tree Game [题意]Zsnuoの博客 [算法]动态规划+排列组合 [题解]题目本身其实并不难,但是大量干扰因素让题目显得很神秘. 参考:Zsn ...

  7. Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合

    C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  8. Codeforces 889C Maximum Element(DP + 计数)

    题目链接  Maximum Element 题意  现在有这一段求序列中最大值的程度片段: (假定序列是一个1-n的排列) int fast_max(int n, int a[]) { int ans ...

  9. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

随机推荐

  1. 使用fprof基本步骤

    $erl -name a@localhost -setcookie abc -remsh b@localhost >fprof:trace([start, {file, "/home/ ...

  2. QMap使用

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMap使用     本文地址:https://www.techieliang.com/201 ...

  3. webgl helloworld

    之前的webgl 初识1, 初识2 已经介绍了webgl的基本概念,工作原理. 没有理解的自己yy. 现呈上例子一枚 <!DOCTYPE html> <html lang=" ...

  4. js & right click menu & 鼠标滑词

    js & right click menu & 鼠标滑词 // 鼠标滑词 mouseSlipGetWords() { const getSelectionText = () => ...

  5. 【loj6307】「雅礼国庆 2017 Day1」Clique 贪心

    题目描述 数轴上有 $n$ 个点,第 $i$ 个点的坐标为 $x_i$ 权值为 $w_i$ .两个点 $i,j$ 之间存在一条边当且仅当 $|x_i−x_j|\le w_i+w_j$ . 你需要求出这 ...

  6. TCP的拥塞控制 (三)

    1.   Multiple Packet Losses Fast Retransmit/Fast Recovery机制可以很好地处理单个packet丢失的问题,但当大量packet同时丢包时(一个RT ...

  7. Mybatis笔记五:Mybatis的全局配置文件Configuration.xml讲解

    从 XML 中构建 SqlSessionFactory 每个基于Mybatis应用都是以一个SqlSessionFactory实例为中心.SqlSessionFactory实例可以由SqlSessio ...

  8. 【BZOJ4197】【NOI2015】寿司晚宴(动态规划)

    [BZOJ4197][NOI2015]寿司晚宴(动态规划) 题面 BZOJ 从\([2,n]\)中选择两个集合(可以为空集),使得两个集合中各选一个数出来,都互质. 求方案数. 题解 对于\(500\ ...

  9. 利用script和scriptlet moniker绕过脚本白名单限制

    没事儿看了一下subtee和enigma0x3今年在BSides Nashville 2017上的演讲,觉得这两个猥琐男简直不能再猥琐了 :-)其中有一个猥琐小技巧,又可以让我们好好hunting一番 ...

  10. Linux内核分析第七周———可执行程序的装载

    Linux内核分析第七周---可执行程序的装载 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...