- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
[AGC001E] BBQ Hard 。
计算
其中 \(n \leq 2 \times 10^5\) , \(a_i,b_i \leq 2000\) 。
以 \(a_i\) 代 \(a_i+b_i\) 则等价于求 。
考虑使得式子变得更加对称,我们可以不限制 \(i,j\) 的相对大小,之后减去 \(i=j\) 的情况再除以 \(2\) 即可.
问题转化为求 。
考虑将 \(i,j\) 拆开分别计算贡献,可以联想到 Vandermonde卷积 于是原式转换为 。
其中 \(F(k)=\displaystyle\sum_{i=1}^n\binom{t_i}{a_i+k}\) 。
然后我们容易想到一个 \(O(na)\) 的做法,那就是直接计算 \(F(k)\) ,注意由于 \(k\) 的范围是 \([-2000,2000]\) ,所以我们需要将 \(k\) 平移至 \([0,4000]\) ,这样就可以用一个数组来存储 \(F(k)\) 了.
for (int k = mink; k <= maxk; ++k) {
for (int i = 1; i <= n; ++i) {
if (k + b[i] >= 0 && k + b[i] <= a[i]) {
F[k + SHIFT] = (F[k + SHIFT] + C[a[i]][k + b[i]]) % MOD;
}
}
}
这个也许卡卡常就能过了,但是我们尝试去追求更好的时间复杂度 事实上,我们利用生成函数的相关知识,有 。
其中 \([x^i]\) 表示 \(x^i\) 项的系数。 则我们只需要求出 。
这个式子可以用秦九韶算法来求,复杂度降低至 \(O(a^2)\) 。
for (int i = 1; i <= n; ++i) {
bInA[a[i]].push_back(-b[i] + SHIFT);
}
for (int i = maxa; i >= 0; --i) {
for (int k = 2* SHIFT; k >= 1; --k) {
F[k] = (F[k] + F[k - 1]) % MOD;
}
for (auto bInAi : bInA[i]) {
F[bInAi] = (F[bInAi] + 1) % MOD;
}
}
#include<iostream>
#include<vector>
using namespace std;
const int MAX_N = 200005, MOD = 998244353, MAX_A = 4000 + 5, SHIFT = 2000;
int ans, n, a[MAX_N], b[MAX_N], maxa, C[MAX_A][MAX_A], mink, maxk;
int fac[MAX_A * 2], inv[MAX_A * 2], invfac[MAX_A * 2];
int F[MAX_A];//from -2000 to 2000, 加上基数2000
int binom(int n, int k) {
if (n < k) {
return 0;
}
return 1ll * fac[n] * invfac[k] % MOD * invfac[n - k] % MOD;
}
vector<int> bInA[MAX_A];
signed main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> b[i];
a[i] += b[i];
maxa = max(maxa, a[i]);
mink = min(mink, -b[i]);
maxk = max(maxk, a[i] - b[i]);
}
for (int i = 0; i <= maxa; ++i) {
C[i][0] = 1;
for (int j = 1; j <= i; ++j) {
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
}
}
/*for (int k = mink; k <= maxk; ++k) {
for (int i = 1; i <= n; ++i) {
if (k + b[i] >= 0 && k + b[i] <= a[i]) {
F[k + SHIFT] = (F[k + SHIFT] + C[a[i]][k + b[i]]) % MOD;
}
}
}*/
for (int i = 1; i <= n; ++i) {
bInA[a[i]].push_back(-b[i] + SHIFT);
}
for (int i = maxa; i >= 0; --i) {
for (int k = 2* SHIFT; k >= 1; --k) {
F[k] = (F[k] + F[k - 1]) % MOD;
}
for (auto bInAi : bInA[i]) {
F[bInAi] = (F[bInAi] + 1) % MOD;
}
}
for (int k = mink; k <= maxk; ++k) {
ans = (ans + 1ll * F[k + SHIFT] * F[-k + SHIFT] % MOD) % MOD;
}
fac[0] = inv[0] = invfac[0] = 1;
fac[1] = inv[1] = invfac[1] = 1;
for (int i = 2; i <= maxa * 2; ++i) {
fac[i] = 1ll * fac[i - 1] * i % MOD;
inv[i] = 1ll * (MOD - MOD / i) * inv[MOD % i] % MOD;
invfac[i] = 1ll * invfac[i - 1] * inv[i] % MOD;
}
for (int i = 1; i <= n; ++i) {
ans = (ans - binom(2 * a[i], 2 * b[i]) + MOD) % MOD;
}
ans = 1ll * ans * inv[2] % MOD;
cout << ans << endl;
return 0;
}
我们可以把这个值看做在网格图上的一点 \((−a[i],−b[i])\) 走到 \((a[j],b[j])\) 的方案数。 而网格图走的方案数可以直接递推得到。 那么我们对于每个点把它的坐标取反到第三象限,然后对于整个坐标系计算走到每一个格子的总方案.
递推式与网格路径完全相同 。
f[i][j] = (1ll * f[i][j] + f[i - 1][j] + f[i][j - 1]) % MOD;
需要注意的是初始条件 。
for(int i = 1; i <= n; i++){
f[SHIFT - a[i]][SHIFT - b[i]]++;
}
最后此篇关于[AGC001E]BBQHard题解的文章就讲到这里了,如果你想了解更多关于[AGC001E]BBQHard题解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我会尝试在这里提出具体问题:- 我正在使用 Python 查看一些相对基础的 DSP,我想实现自动增益控制。除非我弄错了,否则这将采用(简化的)形式: 我不太关心 i/o 信号之间的相移,输入信号是由
我正在使用 Apple 的 CoreAudio 框架来录制我的麦克风馈送。自动增益控制似乎默认启用:https://developer.apple.com/library/mac/#documenta
我正在测试 WebRTC AGC,但我一定做错了,因为信号未经修改就通过了。 以下是我创建和初始化 AGC 的方法: agcConfig.compressionGaindB = 9; agcConfi
我想控制麦克风输入上的增强/AGC 设置。 Windows 7 音频属性显示它具有 AGC 选项。 但是,当我尝试通过 C++ 访问它时,它返回说设备上没有 AGC。 我正在使用DeviceTopol
苹果提供的关闭自动增益控制的 iOS 接口(interface)是否真的实现了,几乎没有共识。有谁确切地知道在 iPad 上录制音频时是否可以关闭 AGC,如果答案是肯定的,如何关闭? 最佳答案 如果
我正在尝试使用 WebRtc 库创建一个独立的 AGC。 (输入 - wav 文件,输出 - 调整增益的 wav 文件)。但是此时我对这个问题有些疑惑。 我正在尝试使用在 gain_control.h
在 16 位 PCM 中,从 Android 手机进行单声道录音,我想禁用 AGC 和高通滤波器以获得纯 MIC 录音。即使使用 JNI 也很好,但需要指导从哪里开始。解决方案应该足够通用以适应所有
我正在开发一个需要对从麦克风捕获的原始 PCM 音频执行识别算法的应用程序。在我测试过的所有 Android 设备上,PCM 数据都是可用的(即原始音频数据)。新的 Sprint EVO 不是这种情况
在 WebRTC 之前的 googletalkplugin 时代,可以通过将 audio-flags: 1 添加到配置文件来禁用 AGC(麦克风的自动增益控制)。然而,由于 Google Hangou
我是一名优秀的程序员,十分优秀!