【CF886E】Maximum Element
考虑正难则反,答案即为\(n!-\text{返回值为n的排列数}\)
一个排列的返回值为\(n\),当且仅当在\(n\)出现之前没有一个数后面有连续\(k\)个小于它的数
设\(f_i\)表示\(1\)到\(i\)的排列中,没有任何一个数后面有连续\(k\)个小于它的数
枚举\(i\)的位置,则有
\]
即把\(i\)放在倒数第\(j\)个位置,从\(1\)到\(i-1\)中选\(j-1\)个数排列在\(i\)后面,剩下\(i-j\)个个数放在\(i\)前面并且保证合法
把排列数打开,就变成了\(f_i=(i-1)!\sum_{j=1}^{k}\frac{f_{i-j}}{(i-j)!}\)
维护一下\(\frac{f_i}{i!}\)的前缀和就可以快速转移了
枚举一下\(n\)所在的位置,返回值为\(n\)的排列数即为
\]
代码
#include<bits/stdc++.h>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
	char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int mod=1e9+7;
const int maxn=1e6+5;
int pre[maxn],fac[maxn],ifac[maxn],inv[maxn],f[maxn];
int n,m;
inline int C(int n,int m) {
	if(n<m) return 0;
	return 1ll*fac[n]*ifac[n-m]%mod*ifac[m]%mod;
}
inline int qm(int x) {return x>=mod?x-mod:x;}
inline int dqm(int x) {return x<0?x+mod:x;}
inline int calc(int l,int r) {
	if(l<=0) return pre[r];
	return dqm(pre[r]-pre[l-1]);
}
int main() {
	n=read(),m=read();fac[0]=ifac[0]=inv[1]=1;
	for(re int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
	for(re int i=2;i<=n;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
	for(re int i=1;i<=n;i++) ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
	f[0]=1;pre[0]=1;
	for(re int i=1;i<n;i++) {
		f[i]=1ll*calc(i-m,i-1)*fac[i-1]%mod;
		pre[i]=qm(pre[i-1]+1ll*f[i]*ifac[i]%mod);
	}
	int ans=0;
	for(re int i=1;i<=n;i++)
		ans=qm(ans+1ll*f[i-1]*C(n-1,i-1)%mod*fac[n-i]%mod);
	printf("%d\n",dqm(fac[n]-ans));
	return 0;
}
												
											【CF886E】Maximum Element的更多相关文章
- 【CF886E】Maximum Element DP
		
[CF886E]Maximum Element 题意:小P有一个1-n的序列,他想找到整个序列中最大值的出现位置,但是他觉得O(n)扫一遍太慢了,所以它采用了如下方法: 1.逐个遍历每个元素,如果这个 ...
 - 【CF888E】Maximum Subsequence(meet in the middle)
		
[CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...
 - 【CF888E】Maximum Subsequence 折半搜索
		
[CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...
 - 【数组】Maximum Subarray
		
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
 - 【leetcode】Maximum Subarray (53)
		
1. Maximum Subarray (#53) Find the contiguous subarray within an array (containing at least one nu ...
 - 【leetcode】Majority Element
		
题目概述: Given an array of size n, find the majority element. The majority element is the element that ...
 - 【leetcode】Maximum Gap
		
Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...
 - 【leetcode】Maximum Subarray
		
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
 - 【leetcode】Maximum Gap(hard)★
		
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
 
随机推荐
- java中接口的简单运用&java中的一些异常(运用myeclipse)
			
package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...
 - Cocos2d-x的Android配置以及相关参考文档
			
关于Win7下配置Coco2d-x的Android开发环境,可以参考子龙山人的博客:Setting Up Cocos2d-x Android Development on Win7,这篇文章写得很详细 ...
 - python面试题之如何用Python找出你目前在哪个目录?
			
>>> import os >>> os.getcwd() 'C:\Users\lifei\AppData\Local\Programs\Python\Python ...
 - 处理CSS前缀问题的神器——AutoPrefixer
			
众所周知为兼容所有浏览器,有的CSS属性需要对不同的浏览器加上前缀,然而有时添加一条属性,需要添加3~4条类似的属性只是为了满足浏览器的兼容,这不仅会增加许多的工作量. What is AutoPre ...
 - 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
			
最近博主由于工作原因需要把之前安装好的的mysql 5.6.44版本卸载,然后安装mysql 5.7.*版本. 前提:为什么要升级到5.7版本? 因为博主在5.6版本上执行脚本时候报出异常:to yo ...
 - 怎么进行代码审查(Code Review)
			
代码审查的重要性 代码审查是熟悉软件架构,了解软件业务逻辑的好方法.学习代码是需要切入点的,一个上百万行代码的系统,从哪里开始着手?只能一个模块一个模块,一个组件一个组件的来熟悉,掌握.实现一个比较大 ...
 - 群晖NAS被攻击
			
上周给新员工办理入职的时候,因为我们有自己的NAS系统,给他们建账号的时候,突然发现群晖无法登陆,很奇怪. 然后查看群晖系统,发现网络能Ping 通,但是群晖管理界面无法打开,一开始以为机房天热,硬盘 ...
 - C# Copy一个文件到另一个文件夹下
			
public static void CopyToFile() { //源文件路径 string sourceName = @"D:\Source\Test.txt"; //目标路 ...
 - POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)
			
Burnside引理经典好题呀! 题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的. 这题 ...
 - Android中App可分配内存的大小(转)
			
转自:http://blog.csdn.net/u011506413/article/details/50965435 现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多 ...