CF886E Maximum Element
题目大意:Petya写了一个假的序列求max
int fast_max(int n, int a[]) {
int ans = 0;
int offset = 0;
for (int i = 0; i < n; ++i)
if (ans < a[i]) {
ans = a[i];
offset = 0;
} else {
offset = offset + 1;
if (offset == k)
return ans;
}
return ans;
}
现在请问对于n的所有排列和代码中的k,调用这个函数返回的不是n的方案数
题解:根据代码 如果序列中出现一个位置的后面连续k个数比这个数小那么就返回这个数
这是一个或的关系,我们容斥一下,方案数为n!-合法方案数,显然合法方案数为序列中n的前面不存在
一个位置的后面连续k个数比这个数小那么就返回这个数
那么我们设f_i为i的排列不存在某个位置的后面连续k个数比这个数小的情况
我们考虑枚举最大值i摆放位置,由于这个值也不能满足条件,所以这个数后面最多有k-1个数,显然我们有dp方程f_i=\sum_{j=i-k+1}^{i}f_{j-1}{(i-1)}^{\underline{i-j}},不过这个方程是O(nk)的,我们可以把排列数拆一下,写成f_i=(i-1)!\sum_{j=i-k+1}^i\frac{f_{j-1}}{(j-1)!},我们发现把\frac{f_i}{i!}搞个前缀和就能做到O(n)转移了。
然后我们考虑收集答案,我们还是考虑枚举n摆放位置,就有Ans=\sum_{i=1}^nf_{i-1}(n-1)^{\underline{n-i}},然后我们发现收集答案就是O(n)的就可以瞎几把写了。
难点主要是设状态。。。
code:
#include <cstdio>
using namespace std;
const int xkj = 1000000007;
int n, k, fac[1000010], inv[1000010], f[1000010], s[1000010];
int qpow(int x, int y)
{
int res = 1;
for (x %= xkj; y > 0; y >>= 1, x = x * (long long)x % xkj)
if (y & 1) res = res * (long long)x % xkj;
return res;
}
int main()
{
scanf("%d%d", &n, &k);
fac[0] = 1;
for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * (long long)i % xkj;
inv[n] = qpow(fac[n], xkj - 2);
for (int i = n; i >= 1; i--) inv[i - 1] = inv[i] * (long long)i % xkj;
f[0] = s[0] = 1;
for (int i = 1; i <= n; i++)
{
f[i] = fac[i - 1] * (long long)(s[i - 1] - (i > k ? s[i - k - 1] : 0) + xkj) % xkj;
s[i] = (f[i] * (long long)inv[i] + s[i - 1]) % xkj;
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
ans = (ans + f[i - 1] * (long long)fac[n - 1] % xkj * inv[i - 1] % xkj) % xkj;
}
printf("%d\n", (fac[n] - ans + xkj) % xkj);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· Java轻量级代码工程
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战