Solution\text{Solution}Solution

纯纯的dp题。
关键在于我们 dp 时只关注不同元素之间的相对大小

非法情况不易统计,考虑转而考虑合法情况再用全排列减。
设计 fif_ifi​ 为长度为 iii 的排列循环到一直最后也没有跳出的方案数。
枚举最大的元素 iii 放置的位置 jjj,由于不能跳出,jjj 只能放在[i−k+1,i][i-k+1,i][i−k+1,i] 的位置。
那么就有:
fi=∑j=i−k+1i(i−1j−1)×fj−1×(j−i)!f_i=\sum_{j=i-k+1}^i \binom{i-1}{j-1}\times f_{j-1}\times (j-i)!fi​=j=i−k+1∑i​(j−1i−1​)×fj−1​×(j−i)!
解释一下,当元素 iii 放在位置 jjj 时,选出 j−1j-1j−1 个数放前面,方案是(i−1j−1)\binom{i-1}{j-1}(j−1i−1​);前面的方案就是 fj−1f_{j-1}fj−1​(和排列是等价的),后面随便放,方案就是阶乘。
然后把组合数拆一下,变成:
fi=∑j=i−k+1i(i−1)!(j−1)!×fj−1f_i=\sum_{j=i-k+1}^i\frac{(i-1)!}{(j-1)!} \times f_{j-1}fi​=j=i−k+1∑i​(j−1)!(i−1)!​×fj−1​
=(i−1)!×∑j=i−k+1ifj−1(j−1)!=(i-1)!\times\sum_{j=i-k+1}^i\frac{f_{j-1}}{(j-1)!} =(i−1)!×j=i−k+1∑i​(j−1)!fj−1​​
=(i−1)!×∑j=i−ki−1fjj!=(i-1)!\times\sum_{j=i-k}^{i-1}\frac{f_{j}}{j!} =(i−1)!×j=i−k∑i−1​j!fj​​
把后面的东西拿前缀和优化一下即可线性求出 fff 数组。
求出 fff 之后,枚举 nnn 所在的位置 iii,答案就是:
ans=∑i=1n(n−1i−1)×fi−1×(n−i)!ans=\sum_{i=1}^n\binom{n-1}{i-1}\times f_{i-1}\times (n-i)!ans=i=1∑n​(i−1n−1​)×fi−1​×(n−i)!

Code\text{Code}Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}const int N=1e6+100;
const int mod=1e9+7;
int n,m,k;
inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=x*res%mod;x=x*x%mod;k>>=1;}return res;
}
ll jc[N],ni[N];
ll f[N],sum[N];
inline ll C(ll n,ll m){return jc[n]*ni[m]%mod*ni[n-m]%mod;
}
signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();k=read();jc[0]=1;for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;ni[n]=ksm(jc[n],mod-2);for(int i=n-1;i>=0;i--) ni[i]=ni[i+1]*(i+1)%mod;f[0]=1;sum[0]=1;for(int i=1;i<=n;i++){f[i]=jc[i-1]*(sum[i-1]+mod-(i-k>0?sum[i-k-1]:0))%mod;sum[i]=(sum[i-1]+f[i]*ni[i])%mod;}ll ans(0);for(int i=1;i<=n;i++){(ans+=f[i-1]*C(n-1,i-1)%mod*jc[n-i]%mod)%=mod;}printf("%lld\n",(jc[n]+mod-ans)%mod);return 0;
}
/*
*/

CF886E Maximum Element(dp、组合数学)相关推荐

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

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

  2. Maximum Element In A Stack 数据结构

    Maximum Element In A Stack 时间限制: 10 Sec  内存限制: 128 MB 题目描述 As an ACM-ICPC newbie,Aishah is learning ...

  3. 【2018icpc宁夏邀请赛现场赛】【Gym - 102222A】Maximum Element In A Stack(动态的栈中查找最大元素)

    https://nanti.jisuanke.com/t/41285 题干: As an ACM-ICPC newbie, Aishah is learning data structures in ...

  4. [CodeForces 332B]Maximum Absurdity[DP]

    题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...

  5. LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)

    LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...

  6. CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个 01 字符串,规定求值的过程如下: 每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数 ...

  7. ZOJ - 4114 Flipping Game(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出 ...

  8. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  9. ARC 128D - Neq Neq(dp+组合数学+思维)

    链接 题意: 给出你一个长度为n的序列,你可以对其操作使得这个序列发生变化,问一共有多少种? 对于连续的i-1,i,i+1,这三个数如果满足 ai−1!=aia_{i-1}!=a_{i}ai−1​!= ...

最新文章

  1. 测试数据精准对比的思考
  2. 如何在python中显示电脑中的图片-python如何在终端里面显示一张图片
  3. 华为设备ENSP静态路由的配置实战
  4. JAVA中return与finally的先后关系
  5. jquery ajax參数加点号状态200进error
  6. 销售联系客户 需要技巧
  7. MikroTik RouterOS电子克隆盘原理收集
  8. 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
  9. 根据shp文件创建Mask文件
  10. 博途V16 更改PLC的型号和固件版本
  11. 云虚拟机和普通虚拟机有什么区别
  12. 【强化学习】Playing Atari with Deep Reinforcement Learning (2013)
  13. NBA得分后卫阅兵:科比榜首麦蒂第9 小AI获至高赞誉
  14. [转载]軟件測試方法
  15. Web 服务寻址(WS-Addressing)对 SOAP 的隐式影响
  16. Matlab GUI中的hObjecthandles
  17. 闪烁之光手游如何在电脑上玩 闪烁之光手游模拟器教程
  18. Taro多端开发webview如何区分端,引入SDK,调用相应接口?
  19. 三维飞行时间图像传感器行业调研报告 - 市场现状分析与发展前景预测
  20. ArcGis空间分析学习:土地利用动态变化分析

热门文章

  1. python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量
  2. 2018年最受大家欢迎的五大机器学习工具和五大数据学习工具
  3. python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目
  4. function里面可以写function吗_氨基酸可以和蜂蜜一起喝吗?蜂蜜里面有氨基酸吗?...
  5. 适合手机端的ckeditor样式_抖音运营干货(三):9款手机视频剪辑APP,让你轻松玩转后期!...
  6. python量化常用_Python量化常用函数
  7. C++ 学习之旅(2)——链接器Linker
  8. android 背景图片居中显示文字,Android ImageSpan 给文字设置圆角背景 并且文字居中,背景居中。...
  9. [mybatis]动态sql_foreach_遍历集合批量插入
  10. [C++STL]常用排序算法