【CodeForces】889 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 排列组合+动态规划的更多相关文章
- Codeforces Gym 100187D D. Holidays 排列组合
D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...
- Codeforces 991E. Bus Number (DFS+排列组合)
解题思路 将每个数字出现的次数存在一个数组num[]中(与顺序无关). 将出现过的数字i从1到num[i]遍历.(i from 0 to 9) 得到要使用的数字次数数组a[]. 对于每一种a使用排列组 ...
- CodeForces - 817B(分类讨论 + 排列组合)
题目链接 思路如下 这一题是:最菜的队伍只有三个人组成,我们只需对排序后的数组的 前三个元素进行分类讨论即可: a[3] != a[2] && a[3] != ar[1] a[3] = ...
- UVA 12906 Maximum Score 排列组合
Maximum Score Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vie ...
- codeforces 57 C Array(简单排列组合)
C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- 【CodeForces】914 H. Ember and Storm's Tree Game 动态规划+排列组合
[题目]H. Ember and Storm's Tree Game [题意]Zsnuoの博客 [算法]动态规划+排列组合 [题解]题目本身其实并不难,但是大量干扰因素让题目显得很神秘. 参考:Zsn ...
- 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 ...
- Codeforces 889C Maximum Element(DP + 计数)
题目链接 Maximum Element 题意 现在有这一段求序列中最大值的程度片段: (假定序列是一个1-n的排列) int fast_max(int n, int a[]) { int ans ...
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
随机推荐
- Java的一些细节问题
一.Java求余%的结果符号取决于除数的符号位:小数也可以求余,余数仍为小数. package com.test; public class Test { /** * @author 容杰龙 */ p ...
- 复利计算C语言转java的相关代码
static void principal()// 计算本金 { int N, m; double i, F, P; System.out.printf("复利终值:"); F = ...
- PAT 甲级 1050 String Subtraction
https://pintia.cn/problem-sets/994805342720868352/problems/994805429018673152 Given two strings S~1~ ...
- PHP面向对象之final关键字
最终类 最终类,其实就是一种特殊要求的类:要求该类不允许往下继承下去. 形式: final class 类名{ //类的成员定义...跟一般类的定义一样! } 最终方法 最终方法,就是一个不允许下 ...
- 第80天:jQuery插件使用
jQuery其他补充+ 4.1 链式编程: end()补充 * 补充五角星 评论案例 * 第一步:鼠标移入,当前五角星和前面的五角星变实体.后面的变空心五角星 * 第二步:鼠标点击的时候,为当前元素添 ...
- KMP算法模板(pascal)
洛谷P3375: program rrr(input,output); var i,j,lena,lenb:longint; a,b:ansistring; next:..]of longint; b ...
- ES2015中的解构赋值
ES2015中允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,被称为”解构(Destructering)“. 以前,为变量赋值,只能指定值. /** * 以前,为变量赋值,只能直接指定值 * ...
- 获取http和ftp地址的图片
根据http和ftp图片地址获取对应图片的缩略图和原图 public class GetBitmapImageClass { public BitmapSource GetImageHttp(stri ...
- 【刷题】BZOJ 3172 [Tjoi2013]单词
Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N ...
- 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)
[BZOJ1396]识别子串&[BZOJ2865]字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在\(SAM\)的\(right/e ...