AT5169 Candy Retribution
题号是洛谷题号。
前置知识:, 方案数为 , 方案数为 ,后一项的证明就是考虑有 个隔板和 个物体隔板,然后隔出来有 个物品,最后一项物品舍弃掉即可。
设 降序排列后为 ,要统计 不好统计,因为你不知道 有多少个,但是可以统计 即非法序列个数。
首先将 弱化成 ,就是差分一下 Solve(R)-Solve(L-1)
。
枚举 的值 ,设 表示当前序列总和小于等于 , 个数大于等于 ,剩余 个数小于 的方案数,那么 时这一块的非法序列个数就是 。
考虑如何求 ,先选 个位置作为 的位置,剩余 位置小于 ,但是注意到隔板法不好求对每个数上界和下界(非 0)有限制的方案数,于是考虑容斥,枚举 表示 个位置中至少有 个位置 ,将这 个位置和之前的 的数全部从和当中减掉,新和就是 ,然后又要求减掉后的序列和小于等于 ,于是有:
因此最后非法序列个数就是 ,总序列个数 减去即可。
由于要求 ,而 成倍数增长,所以实际复杂度为调和级数。
Code:
/*
========= Plozia =========
Author:Plozia
Problem:AT5169 Candy Retribution
Date:2022/9/25
========= Plozia =========
*/
#include <bits/stdc++.h>
#define int long long
typedef long long LL;
const int MAXN = 6e5 + 5;
const LL P = 1e9 + 7;
int n, m, l, r;
LL fact[MAXN], inv[MAXN];
int Read()
{
int sum = 0, fh = 1; char ch = getchar();
for (; ch < '0' || ch > '9'; ch = getchar()) fh -= (ch == '-') << 1;
for (; ch >= '0' && ch <= '9'; ch = getchar()) sum = (sum << 3) + (sum << 1) + (ch ^ 48);
return sum * fh;
}
LL ksm(LL a, LL b = P - 2, LL p = P)
{
LL s = 1 % p;
for (; b; b >>= 1, a = a * a % p)
if (b & 1) s = s * a % p;
return s;
}
LL C(LL n, LL m) { return fact[n] * inv[m] % P * inv[n - m] % P; }
LL f(int x, int y, int s)
{
LL sum = 0;
for (int i = 0; i <= n - m; ++i)
{
if (1ll * s - m * x - i * y < 0) return sum * C(n, m) % P;
sum = (sum + ((i & 1) ? -1 : 1) * C(n - m, i) * C(1ll * s - m * x - i * y + n, n) % P) % P;
sum = (sum + P) % P;
}
return sum * C(n, m) % P;
}
LL Solve(int s)
{
LL sum = 0;
for (int i = 1; i <= s; ++i)
sum = ((sum + f(i, i, s) - f(i + 1, i, s)) % P + P) % P;
return (C(s + n, n) % P - sum + P) % P;
}
signed main()
{
n = Read(), m = Read(), l = Read(), r = Read();
fact[0] = 1; for (int i = 1; i <= 600000; ++i) fact[i] = fact[i - 1] * i % P;
inv[600000] = ksm(fact[600000]); for (int i = 599999; i >= 0; --i) inv[i] = (i + 1) * inv[i + 1] % P;
printf("%lld\n", ((Solve(r) - Solve(l - 1)) % P + P) % P); return 0;
}
标签:
计数题,计数 dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现