$n \leq 2000000$的排列,问有多少满足:存在个$i$,使得$p_i \neq n$,且$p_j<p_i,j \in [i+1,i+K]$,$K \leq 2000000$是给定常数。膜$1e9+7$。

排列题还是比较菜。。

这次的切入点依然是排列题的经典套路--考虑将$n$加入$n-1$的合法排列,从而建立递推关系。

先从答案要求入手,假如把$n$插进位置$i$,那么$i$之前的序列必须已经合法,否则要么接下来一个数是$n$,后面$K$个数一定$<n$,不合法,要么这序列根本就不合法,就gg。也就是说,$n$之前的数字的大小关系已经确定了。确定大小关系的情况可以开始递推:$D(i)$表示$i$在位置$i$时,剩下$i-1$个数乱排时的合法排列数——$n$(注意,这里真的是$n$)在位置$i$时,前$i-1$个数一旦确定,他们的大小关系必须如同$D(i)$的方案,然后其他的数乱排列。因此最终答案为$\sum_{i=1}^{n}D(i)\frac{(n-1)!}{(i-1)!}$。搞定。

注意这里通过大小关系把$n$变成更小的东西。

现在试着求$D(i)$。首先$i<=K$时$D(i)=0$这实际上排除了一重条件$p_i \neq n$,因为此时造成$p_j<p_i,j \in [i+1,i+K]$的只有非$n$的数。好那就来看看剩下最大的$n-1$。当$n-1$放在前$i-K-1$个位置时,它就是符合条件的$i$。当它放在$i-K$往后的位置时,又来!此时$n-1$后边是不可能有非法$i$了,但前面一定有,大小关系又是$D$!于是有$D(n)=(n-K-1)(n-2)!+\sum_{i=n-K}^{n-1}D(i)*\frac{(n-2)!}{(i-1)!}$,把$(n-2)!$提到前面,记个前缀和即可。

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<queue>
//#include<time.h>
//#include<complex>
#include<algorithm>
#include<stdlib.h>
using namespace std; int n,K;
#define maxn 2000011
const int mod=1e9+;
int fac[maxn],inv[maxn]; int powmod(int a,int b)
{
int ans=;
while (b)
{
if (b&) ans=1ll*a*ans%mod;
a=1ll*a*a%mod; b>>=;
}
return ans;
} int sum[maxn],f[maxn];
int main()
{
scanf("%d%d",&n,&K);
fac[]=; for (int i=;i<=n;i++) fac[i]=fac[i-]*1ll*i%mod;
inv[n]=powmod(fac[n],mod-); for (int i=n;i>=;i--) inv[i-]=1ll*inv[i]*i%mod;
for (int i=;i<=K;i++) f[i]=sum[i]=;
for (int i=K+;i<=n;i++)
{
f[i]=(1ll*(i-K-)*fac[i-]%mod+1ll*fac[i-]*(sum[i-]+mod-sum[i-K-])%mod)%mod;
sum[i]=(sum[i-]+1ll*f[i]*inv[i-])%mod;
}
int ans=;
for (int i=;i<=n;i++) ans=(ans+1ll*(sum[i]-sum[i-]+mod)*fac[n-])%mod;
printf("%d\n",ans);
return ;
}

Codeforces889C. Maximum Element的更多相关文章

  1. 【CF886E】Maximum Element DP

    [CF886E]Maximum Element 题意:小P有一个1-n的序列,他想找到整个序列中最大值的出现位置,但是他觉得O(n)扫一遍太慢了,所以它采用了如下方法: 1.逐个遍历每个元素,如果这个 ...

  2. 【CodeForces】889 C. Maximum Element 排列组合+动态规划

    [题目]C. Maximum Element [题意]给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[ ...

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

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

  4. Codeforces 886E Maximum Element 组合数学 + dp

    我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程   dp[ i ] = sum(dp[ i - j - ...

  5. CF886E Maximum Element

    $ \color{#0066ff}{ 题目描述 }$ 从前有一个叫Petya的神仙,嫌自己的序列求max太慢了,于是将序列求max的代码改成了下面这个样子: int fast_max(int n,in ...

  6. Codeforces - 102222A - Maximum Element In A Stack - 模拟

    https://codeforc.es/gym/102222/problem/F 注意到其实用unsigned long long不会溢出. #include<bits/stdc++.h> ...

  7. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Maximum Element In A Stack

    //利用二维数组模拟 #include <iostream> #include <cstdio> #include <cstring> #include <s ...

  8. Codeforces Round #445 Div. 1 C Maximum Element (dp + 组合数学)

    题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下 ...

  9. 【CF886E】Maximum Element

    题目 考虑正难则反,答案即为\(n!-\text{返回值为n的排列数}\) 一个排列的返回值为\(n\),当且仅当在\(n\)出现之前没有一个数后面有连续\(k\)个小于它的数 设\(f_i\)表示\ ...

随机推荐

  1. Java GUI 基础组件

    1.JLabel  标签 构造函数: JLabel() JLabel(String text) JLabel(String text,int align)     //第二个参数设置文本的对齐方式,常 ...

  2. Spring-aop(一)

    写一个计算类,计算前后需要打印日志. interface ArithmeticCalculator { public int add(int i, int j); public int sub(int ...

  3. checkbox:全选、全不选、单选(慕课网题目)

    任务 1.在第27行处补充完整,实现当点击"全选"按钮时,将选中所有的复选项. 提示:document.getElementsByTagName("input" ...

  4. 离开APM的弹性云还是真弹性吗

    准确来说应该叫脱离业务的弹性云或者容器都是伪弹性.之所以标题中有APM一是因为它近来热门,二是因为它在我将要说的这个事情上起到关键性的作用. 不管是亚马逊的弹性云.容器方案或者国内众多云厂商在自动伸缩 ...

  5. Linux 使用常见问题

    1. 如何查看软件安装到什么位置 [Ubuntu] 今天安装了Lxc-docker,想看一下文件都安装到哪里了,首先找到这个包的ersion zhouh1@uhome:~$ dpkg -s lxc-d ...

  6. (转)Spring简介

    http://blog.csdn.net/yerenyuan_pku/article/details/52830571 阿昀以一个初学者的身份学习Spring框架,并按照一个小白的思路详细总结学习过程 ...

  7. Mysql 访问远程数据库,报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost

    参考:http://www.cnblogs.com/xyzdw/archive/2011/08/11/2135227.html 解决方法: 1. 改表法. 可能是你的帐号不允许从远程登陆,只能在loc ...

  8. 用固定长度的数组实现stack queue

    package my_basic.class_3; /** * 用数组结构实现大小固定的队列和栈 */ public class Code_01_Array_stack_queue { public ...

  9. vue2.0中transition组件的用法

    作用:实现元素进入/离开的过渡效果. 首先,让我们举个栗子: <!DOCTYPE html> <html lang="en"> <head> & ...

  10. 浅谈Link-Cut Tree(LCT)

    0XFF 前言&概念 Link-Cut Tree 是一种用来维护动态森林连通性的数据结构,适用于动态树问题.它采用类似树链剖分的轻重边路径剖分,把树边分为实边和虚边,并用 Splay 来维护每 ...