ZJL 的妹子序列

暴力就是 \(\Theta(n\times m)\)

如果 \(n,m \le 10^5\) ?

考虑问题的转换,设 \(a_i\) 表示 \(i\) 小的在它后面的数的个数

\(0\le a_i \le i-1\),显然任何一个满足要求的 \(a\) 数列都可以从大到小放数字构成一个满足要求的排列

那么就是要求 \(0\le a_i \le i-1,\sum_{i=1}^{n}a_i=m\) 的方案数

考虑生成函数

\[\prod_{i=1}^{n}\sum_{j=0}^{i-1}x^j
\]

\[\prod_{i=1}^{n}\frac{1-x^i}{1-x}
\]

方法一

求 \(Ln\) 后,即

\[\sum_{i=1}^{n}Ln(1-x^i)-nLn(1-x)
\]

\[Ln(1-x^i)=-\sum_{j=1}\frac{x^{ij}}{j}
\]

证明:

\[Ln(F(x))=G(x)
\]

\[\frac{F'(x)}{F(x)}=G'(x)
\]

\[\frac{-ix^{i-1}}{1-x^i}=G'(x)
\]

\[\sum_{j=0}-ix^{i-1}x^{ij}=G'(x)
\]

\[\sum_{j=0}\frac{-ix^{ij+i}}{ij+i}=G(x)
\]

\[\sum_{j=1}\frac{-x^{ij}}{j}
\]

证毕

以调和级数的复杂度 \(\Theta(nlnn)\)求出来后 \(exp\) 就好了

方法二

\[\prod_{i=1}^{n}\frac{1-x^i}{1-x}
\]

\[\prod_{i=1}^{n}(1-x^i)(\frac{1}{1-x})^n
\]

后面的

\[(\frac{1}{1-x})^n=(\sum_{i=0}x^i)^n
\]

即就是从 \(n\) 个不同的集合中间可以重复的取出 \(i\) 个的方案数的生成函数

那么就是

\[\sum_{i=0}(^{n+i-1}_{n-1})x^i
\]

考虑前面的

\[\prod_{i=1}^{n}(1-x^i)
\]

相当于一个带符号的背包计数问题

而第 \(i\) 个的体积是 \(i\)

经典 \(DP\),就是选出一个上升的序列的方案数

设 \(f[i][j]\) 表示选了 \(i\) 个,和为 \(j\) 的方案

\(f[i][j]=f[i][j-i]-f[i-1][j-i]\) (带符号)

考虑到可能有某个的大小超过 \(n\)

那么 \(f[i][j]+=f[i-1][j-(n+1)]\)

由于每个体积不同,所以最多选出 \(\sqrt{n}\) 个

复杂度 \(\Theta(n\sqrt{n})\)

#include <bits/stdc++.h>
using namespace std; namespace IO {
const int maxn((1 << 21) + 1); char ibuf[maxn], *iS, *iT, c;
int f; char Getc() {
return (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++);
} template <class Int> void In(Int &x) {
for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
for (x = 0; c <= '9' && c >= '0'; c = Getc()) x = (x << 3) + (x << 1) + (c ^ 48);
x *= f;
}
} using IO :: In; const int mod(998244353);
const int maxn(2e5 + 5); int fac[maxn], ifac[maxn], inv[maxn], n, m, f[500][maxn]; inline void Inc(int &x, int y) {
x += y;
if (x >= mod) x -= mod;
} inline int C(int x, int y) {
if (y > x) return 0;
return 1LL * fac[x] * ifac[y] % mod * ifac[x - y] % mod;
} int main() {
fac[0] = fac[1] = ifac[0] = ifac[1] = inv[1] = 1;
for (int i = 2; i <= 200000; ++i) {
inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod;
fac[i] = 1LL * fac[i - 1] * i % mod;
ifac[i] = 1LL * ifac[i - 1] * inv[i] % mod;
}
In(n), In(m);
int sz = 500, ans = 0;
f[0][0] = 1;
for (int i = 1; i < sz; ++i)
for (int j = 0; j <= m; ++j) {
if (j >= i) f[i][j] = (f[i][j - i] - f[i - 1][j - i] + mod) % mod;
if (j >= n + 1) Inc(f[i][j], f[i - 1][j - n - 1]);
}
for (int i = 0; i <= m; ++i) {
int ret = 0;
for (int j = 0; j < sz; ++j) Inc(ret, f[j][i]);
Inc(ans, 1LL * ret * C(n + m - i - 1, n - 1) % mod);
}
printf("%d\n", ans);
return 0;
}

[HAOI2009]逆序对数列(加强)的更多相关文章

  1. bzoj2431:[HAOI2009]逆序对数列

    单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...

  2. BZOJ 2431: [HAOI2009]逆序对数列( dp )

    dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...

  3. 2431: [HAOI2009]逆序对数列

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 954  Solved: 548[Submit][Status ...

  4. P2513 [HAOI2009]逆序对数列

    P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那 ...

  5. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...

  6. BZOJ2431 HAOI2009 逆序对数列 【DP】*

    BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai​,如果有i<j且ai>aja_i>a_jai​>aj​,那么我们称aia ...

  7. 洛谷P2513 [HAOI2009]逆序对数列

    P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易 ...

  8. bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2312  Solved: 1330[Submit][Stat ...

  9. Bzoj 2431 HAOI2009 逆序对数列

    Description 对于一个数列{ai},如果有i**<**j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数. ...

  10. [HAOI2009]逆序对数列

    题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样 ...

随机推荐

  1. python3字典:获取json响应值来进行断言的用法详解

    在Python中我们做接口经常用到一些json的返回值我们常把他转化为字典,在前面的python数据类型详解(全面)中已经谈到对字典的的一些操作,今天我们就获取json返回值之后,然后转化为字典后的获 ...

  2. iOS 一张图片引发的崩溃SEGV_ACCERR

    出错日志一直报SEGV_ACCERR,原因原来是第三方库SDWebImage下载图片,远程图片的json文件不对导致的闪退 解决方法: 1.command + B 编译工程(最好在编译工程时,清除下缓 ...

  3. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  4. 解决织梦dedecms文档关键字(自动内链)php5.5以上失效的问题 urf-8版本的

    找到include/arc.archives.class 在里面需要修改两次地方 在1230行 // 这里可能会有错误 if (version_compare(PHP_VERSION, '5.5.0' ...

  5. 题解 [ZJOI2010]数字计数

    传送门<-洛谷版 电梯<-bzoj版 这份代码是新手友好版,也算是自用版,注释自认为写的很详细. 希望对要学数位dp的人有所帮助 这份题解是记忆化搜索版的数位DP,个人还是比较建议用这种方 ...

  6. 云服务器、vps、虚拟主机的区别

    云服务器 Elastic Compute Service, 简称ECS 好多人理解云服务器和VPS一样,更有甚者说以前的VPS现在的说法就是云服务器,其实不然,云服务器是一个计算,网络,存储的组合.简 ...

  7. 自定义 mapper

    1. 定义一个接口 public interface ItemMapper { List<Item> getItemList(); } 2. 编写  xml  文件 ,  将sql 语句填 ...

  8. 威尔逊定理--HDU2973

    参考博客 HDU-2973 题目 Problem Description The math department has been having problems lately. Due to imm ...

  9. 四、OE 中添加对供应商名称的唯一限制

    最初的思路是利用sql_constraints 来限制重复的供应商名称,但后来想到在OE中供应商.客户乃至员工都隶属于Partner,sql_constrainst实际上是通过限制partner来限制 ...

  10. Mac无法将自定义图标添加到Launchpad的替代方案(桌面双击Shell运行)

    截止在几天之前的Mac OS版本都无法实现将自定义图标添加到Launchpad.我使用的是10.12. 替代的思路就是在桌面新建一个Shell文件,然后使软件在后台运行,最后就是双击Shell文件能自 ...