CF886E Maximum Element(dp、组合数学)
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−1j!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、组合数学)相关推荐
- Codeforces 889C Maximum Element(DP + 计数)
题目链接 Maximum Element 题意 现在有这一段求序列中最大值的程度片段: (假定序列是一个1-n的排列) int fast_max(int n, int a[]) { int ans ...
- Maximum Element In A Stack 数据结构
Maximum Element In A Stack 时间限制: 10 Sec 内存限制: 128 MB 题目描述 As an ACM-ICPC newbie,Aishah is learning ...
- 【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 ...
- [CodeForces 332B]Maximum Absurdity[DP]
题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...
- LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)
LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...
- CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)
题目链接:点击查看 题目大意:给出一个 01 字符串,规定求值的过程如下: 每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数 ...
- ZOJ - 4114 Flipping Game(dp+组合数学)
题目链接:点击查看 题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出 ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
- ARC 128D - Neq Neq(dp+组合数学+思维)
链接 题意: 给出你一个长度为n的序列,你可以对其操作使得这个序列发生变化,问一共有多少种? 对于连续的i-1,i,i+1,这三个数如果满足 ai−1!=aia_{i-1}!=a_{i}ai−1!= ...
最新文章
- 测试数据精准对比的思考
- 如何在python中显示电脑中的图片-python如何在终端里面显示一张图片
- 华为设备ENSP静态路由的配置实战
- JAVA中return与finally的先后关系
- jquery ajax參数加点号状态200进error
- 销售联系客户 需要技巧
- MikroTik RouterOS电子克隆盘原理收集
- 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
- 根据shp文件创建Mask文件
- 博途V16 更改PLC的型号和固件版本
- 云虚拟机和普通虚拟机有什么区别
- 【强化学习】Playing Atari with Deep Reinforcement Learning (2013)
- NBA得分后卫阅兵:科比榜首麦蒂第9 小AI获至高赞誉
- [转载]軟件測試方法
- Web 服务寻址(WS-Addressing)对 SOAP 的隐式影响
- Matlab GUI中的hObjecthandles
- 闪烁之光手游如何在电脑上玩 闪烁之光手游模拟器教程
- Taro多端开发webview如何区分端,引入SDK,调用相应接口?
- 三维飞行时间图像传感器行业调研报告 - 市场现状分析与发展前景预测
- ArcGis空间分析学习:土地利用动态变化分析
热门文章
- python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量
- 2018年最受大家欢迎的五大机器学习工具和五大数据学习工具
- python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目
- function里面可以写function吗_氨基酸可以和蜂蜜一起喝吗?蜂蜜里面有氨基酸吗?...
- 适合手机端的ckeditor样式_抖音运营干货(三):9款手机视频剪辑APP,让你轻松玩转后期!...
- python量化常用_Python量化常用函数
- C++ 学习之旅(2)——链接器Linker
- android 背景图片居中显示文字,Android ImageSpan 给文字设置圆角背景 并且文字居中,背景居中。...
- [mybatis]动态sql_foreach_遍历集合批量插入
- [C++STL]常用排序算法