「hackerrank - 101hack43」K-Inversion Permutations
原问题即:请你给出不同的序列 \(\{a_n\}\) 的数量,满足 \(0\leqslant a_i<i\),且 \(\sum a_i=k\)。
那么写出 \({a_n}\) 的 ogf,可得答案为:\(\displaystyle [x^k]\left(G(x)=\sum_{i=0}^{n-1} x^i=\frac{1-x^n}{1-x}\right)=\frac{\prod_{i=1}^n(1-x^i)}{(1-x)^n}=\left(\prod_{i=1}^n(1-x^i)\right)\left(\sum_{i=0}^n\binom{n-1+i}{i} x^i\right)\)。
前面那个括号是有组合意义的,即有 \(n\) 个物品,其第 \(i\) 个体积为 \(i\),有个容量 \(k\) 的背包,求恰好填满背包的方案数,这个方案数还要乘一个系数 \((-1)^m\),\(m\) 为选的物品的个数。
后面那个你就直接算,前面的可以 dp。考虑这样一个构造过程:
一开始什么数都没有。对已有的数,我们有两种操作,一种是全部加 \(1\),一种是全部加 \(1\) 然后再加入一个值为 \(1\) 的数。这样执行若干次操作之后构造出来的数列一定满足条件。
然后就设 \(f(i,j)\) 为选了 \(i\) 个数,目前的和为 \(j\) 的方案数,转移很简单,依照两种操作模拟即可。
太神仙了,我脑子不够用。然后第一维的规模是根号,所以能过了。
#include <bits/stdc++.h>
constexpr int kMod = 1e9 + 7;
constexpr int kN = 1e5, kSqrt = 500;
int n, k, f[kSqrt + 5][kN + 5], fac[kN * 2 + 5], ifac[kN * 2 + 5];
inline void addeq(int& u, const int v) { (u += v) >= kMod && (u -= kMod); }
inline void muleq(int& u, const int v) { u = static_cast<long long>(u) * v % kMod; }
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += kMod); }
inline int add(int u, const int v) { return (u += v) < kMod ? u : u - kMod; }
inline int mul(const int u, const int v) { return static_cast<long long>(u) * v % kMod; }
inline int mpow(int x, int y) {
int res = 1;
for (; y; y >>= 1, muleq(x, x))
if (y & 1) muleq(res, x);
return res;
}
template <typename... Args>
inline int mul(const int u, const int v, const Args... args) { return mul(u, mul(v, args...)); }
inline void init(const int n) {
fac[0] = 1;
for (int i = 1; i <= n; ++i) fac[i] = mul(fac[i - 1], i);
ifac[n] = mpow(fac[n], kMod - 2);
for (int i = n - 1; ~i; --i) ifac[i] = mul(ifac[i + 1], i + 1);
}
inline int com(const int x, const int y) { return mul(fac[x], ifac[x - y], ifac[y]); }
signed main() {
init(2 * kN);
std::cin >> n >> k;
f[0][0] = 1;
const int kS = std::trunc(std::sqrt(k * 2) + 1);
for (int i = 1; i <= kS; ++i)
for (int j = 0; j <= k; ++j) {
if (j >= i) f[i][j] = add(f[i - 1][j - i], f[i][j - i]);
if (j >= n + 1) subeq(f[i][j], f[i - 1][j - n - 1]);
}
int res = 0;
for (int i = 0; i <= kS; ++i)
for (int j = 0; j <= k; ++j) addeq(res, mul((i & 1) ? kMod - 1 : 1, f[i][j], com(k - j + n - 1, k - j)));
std::cout << res << "\n";
return 0;
}
「hackerrank - 101hack43」K-Inversion Permutations的更多相关文章
- LibreOJ2043 - 「CQOI2016」K 远点对
Portal Description 给出平面上的\(n(n\leq10^5)\)个整点,求在欧几里得距离下第\(k\)远的点对之间的距离. Solution k-d树+堆. 用小根堆维护当前找到的第 ...
- 「ZJOI2013」K大数查询
「ZJOI2013」K大数查询 传送门 整体二分,修改的时候用线段树代替树状数组即可. 参考代码: #include <cstdio> #define rg register #defin ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- Loj #2495. 「AHOI / HNOI2018」转盘
Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...
- loj#2020 「AHOI / HNOI2017」礼物 ntt
loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...
- LOJ #2026「JLOI / SHOI2016」成绩比较
很好的锻炼推柿子能力的题目 LOJ #2026 题意 有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数 定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数 ...
- LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)
题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...
- LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)
题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...
- LOJ #2540. 「PKUWC 2018」随机算法(概率dp)
题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...
随机推荐
- Java(多态)
1.多态 动态编译:类型 即同一方法可以根据发送对象的不同而采用不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用可以有很多 多态存在条件 有继承关系 子类重写父类方法 父类引用指向子类 ...
- 安卓第一课:gradle仓库的导入
今天装好android studio,结果刚进入就报错了: SSL peer shut down incorrectly 读注释发现原来是gradle下载文件不成功.果然,原来是vpn掉线了,上网查了 ...
- 「AntV」L7地理可视化:从入门到实践
1. 前言 这是一篇由浅入深的AntV L7的学习笔记总结,记述了从了解到使用的一些过程 本文所使用的数据(包括数据处理过程)和代码均有详细描述,所有案例均可复现,甚至大部分代码可直接使用 如果喜欢分 ...
- Python运维开发之路《数据类型》
一. python数据类型 python的五大基本数据类型,数字.字符串.列表.元组.字典;其他数据类型,类型type.Null.文件.集合.函数/方法.类.模块. 1.数字 1 ①整型 2 十进制转 ...
- python学习--采集弹幕信息
# -*- coding: utf-8 -*-"""Created on Mon Nov 4 12:00:12 2019 @author: DELL"" ...
- java解析CSV文件(getCsvData 解析CSV文件)
首先需要下载opencsv的jar包 <!-- https://mvnrepository.com/artifact/com.opencsv/opencsv --> <depende ...
- 即构推出低延迟直播产品L3,可将直播延迟降到1s
近日,全球云通讯服务提供商ZEGO即构科技推出低延迟直播产品Low-Latency Live,简称L3.这款产品对传统CDN直播中"延迟较大.弱网抗性差.观众端内容不同步"等问题进 ...
- subprocess Python执行系统命令最优选模块
简介 subprocess 是 Python 中执行操作系统级别的命令的模块,所谓系级级别的命令就是如ls /etc/user ifconfig 等和操作系统有关的命令. subprocess 创建子 ...
- Chrome 报错: Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
经检查,是由浏览器中的插件导致的报错. 解决方案: 将该插件移除或关闭
- NAT与NAT实验
1.NAT与NAT实验 NAT(网络地址翻译) 一个数据包目的ip或者源ip为私网地址, 运营商的设备无法转发数据. 实际场景问题 如下图 201.0.0.1 公网地址? 买的 运营商给你的19 ...