注意到仅关心于权值大小,预处理出$F_{i}(n)$​​​​表示$a_{1},a_{2},...,a_{n}$​​​​中恰填$i$​​​​​​种不同的数的方案数,那么显然答案即为$\sum_{i=1}^{\min(n,m)}{m\choose i}F_{i}(n)$​​​​,可以$o(n)$​​​​计算

下面,问题即如何求出$F_{i}(n)$——

考虑从小到大填数,注意到并没有确定$n$​,因此填数是在原序列中插入数

不难发现,如果$x$填了不少于两次且在末尾填了,那么令$i$为其第一次填的位置,则$\max_{k=1}^{i}a_{k}=a_{n}=x$且显然$i<n$,同时只需要之后在$a_{i}$之前填一个数就可以避免此情况

考虑容斥,即将序列中满足$\exists i<j\le n$且$\max_{k=1}^{i}a_{k}=\min_{k=j}^{n}a_{k}$的$a_{i}$前缀最大值取出(即不存在更小的满足条件的$i'$使得$a_{i'}\ge a_{i}$​​​​​),并对序列容斥(任选其中的子序列,若子序列长度为$l$,则贡献系数为$(-1)^{l}$)

注意到对于这样的前缀最大值,其之前不能再填数字(从小到大填数),即可以用dp计算

具体的,令$g_{i}(a,b)$​填了$i$​种数且当前容斥选择的序列末尾为$a$​(若$a=0$​即序列为空)且填了$a+b$​​​​​​个数的方案数(带贡献系数),不难得到转移为
$$
\begin{cases} { b+s\choose s}g_{i}(a,b)\rightarrow g_{i+1}(a,b+s)&(s\ge 1)\\-{b-k+s\choose s}g_{i}(a,b)\rightarrow g_{i+1}(a+k+1,b-k+s+1) &(0\le k\le b,s\ge 0)\end{cases}
$$
进一步的,有$F_{i}(n)=\sum_{a=0}^{n}g_{i}(a,n-a)$​​​​​,但直接根据递推式计算$g$​​​​​的复杂度为$o(n^{5})$​​​​​​,无法通过

下面,问题即如何快速求出$g_{i}(a,b)$​——

考虑$g$​​的二元生成函数$f_{i}(x,y)=\sum_{a,b\ge 0}g_{i}(a,b)x^{a}\frac{y^{b}}{b!}$​​(其中$y$​​上是指数生成函数),代入转移即
$$
f_{i+1}(x,y)=(e^{y}-1)f_{i}(x,y)-\sum_{a,b\ge 0}g_{i}(a,b)\sum_{k=0}^{b}\sum_{s\ge 0}{b-k+s\choose s}x^{a+k+1}\frac{y^{b-k+s+1}}{(b-k+s+1)!}
$$
前者显然容易处理,下面先考虑后者(去掉负号):

事实上,$f_{i}(x,y)$​​​​总可以被写作$\sum_{p,q\ge 0}c_{p,q}x^{p}e^{qy}$​​​​的形式(正确性归纳即可),显然其对相同的$a,b$​​有相同的系数(但对$p,q$​​没有),不妨仅考虑其中一项$x^{p}e^{qy}$​​的影响,(将$e^{qy}$​​泰勒展开后)代入即
$$
\sum_{b\ge 0}q^{b}\sum_{k=0}^{b}\sum_{s\ge 0}{b-k+s\choose s}x^{p+k+1}\frac{y^{b-k+s+1}}{(b-k+s+1)!}
$$
调换枚举变量,依次枚举$k,b-k+s$​和$b-k$​,即为
$$
\sum_{k\ge 0}q^{k}x^{p+k+1}\sum_{s'\ge 0}\frac{y^{s'+1}}{(s'+1)!}\sum_{b'=0}^{s'}q^{b'}{s'\choose b'}
$$
利用公式,不难得到即为$\frac{x^{p+1}}{1-qx}\frac{1}{q+1}(e^{(q+1)y}-1)$​

(前者由于式子与$a,b$​无关,因此对相同的$p,q$​也有相同的系数,直接代入即可)

综上,两者都可以$o(n^{2})$计算,也即可$o(n^{3})$求出所有$f_{i}(x,y)$​,进而有
$$
F_{i}(n)=\sum_{a=0}^{n}g_{i}(a,n-a)=\sum_{a=0}^{n}\sum_{q\ge 0}c_{a,q}q^{n-a}
$$
预处理出$S_{q,n}=\sum_{a=0}^{n}q^{n-a}c_{a,q}=qS_{q,n-1}+c_{n,q}$​​​​​​,那么即$F_{i}(n)=\sum_{q\ge 0}S_{q,n}$​​​​​​,也可以$o(n^{3})$​​​​​​​求出​​

(这个方法也可以用于$\frac{1}{1-qx}$​的计算上)

另外,由于内存限制,需要对$f$滚动计算

最终,总复杂度为$o(n^{3}+Tn)$​​​​,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 305
4 #define mod 998244353
5 #define ll long long
6 int t,n,m,ans,inv[N],f[2][N][N],F[N][N];
7 int main(){
8 n=300;
9 inv[0]=inv[1]=f[0][0][0]=1;
10 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
11 for(int i=1;i<=n;i++){
12 int ii=(i&1);
13 memset(f[ii],0,sizeof(f[ii]));
14 for(int p=0;p<=n;p++)
15 for(int q=0;q<i;q++){
16 f[ii][p][q+1]=(f[ii][p][q+1]+f[ii^1][p][q])%mod;
17 f[ii][p][q]=(f[ii][p][q]-f[ii^1][p][q]+mod)%mod;
18 }
19 for(int q=0;q<i;q++){
20 int s=0;
21 for(int j=0;j<n;j++){
22 s=((ll)s*q+f[ii^1][j][q])%mod;
23 f[ii][j+1][q+1]=(f[ii][j+1][q+1]-(ll)s*inv[q+1]%mod+mod)%mod;
24 f[ii][j+1][0]=(f[ii][j+1][0]+(ll)s*inv[q+1])%mod;
25 }
26 }
27 for(int q=0;q<=i;q++){
28 int s=f[ii][0][q];
29 for(int j=1;j<=n;j++){
30 s=((ll)s*q+f[ii][j][q])%mod;
31 F[i][j]=(F[i][j]+s)%mod;
32 }
33 }
34 }
35 scanf("%d",&t);
36 while (t--){
37 scanf("%d%d",&n,&m);
38 ans=0;
39 int s=1;
40 for(int i=1;i<=min(n,m);i++){
41 s=(ll)s*(m-i+1)%mod*inv[i]%mod;
42 ans=(ans+(ll)s*F[i][n])%mod;
43 }
44 printf("%d\n",ans);
45 }
46 return 0;
47 }

[hdu7011]被EI加0了的更多相关文章

  1. SPSS输出结果如何在word中设置小数点前面显示加0

    SPSS输出结果如何在word中设置小数点前面显示加0 在用统计分析软件做SPSS分析时,其输出的结果中,如果是小于1(绝对值)的数,那么会默认输出不带小数点的数值.例如0.362和 -0.141被显 ...

  2. 字符数组什么时候要加‘\0’

    当字符数组以单个字符进行赋值时: char ch[10]; ch[10]={'a','b',---'\0'}; 或者用for循环进行赋值时: for (i=0; i<9; i++){ch[i]= ...

  3. sql语句 在字段前面加0

    目前数字如下: 1 2 3 10 想变成长度为5位,如果不够,前面补0, 写法如下 select right('00000'+ltrim(你的字段),5) 结果: 00001 00002 00003 ...

  4. php 格式化数字 位数不足前面加0补足

    本文引用自 http://www.fengfly.com/plus/view-62827-1.html 补0: <?php $var = sprintf("%03d", 12 ...

  5. 在js中做数字字符串加0补位,效率分析

    分类: Jquery/YUI/ExtJs 2010-08-30 11:27 2700人阅读 评论(0) 收藏 举报 functiondate算法语言c 通常遇到的一个问题是日期的“1976-02-03 ...

  6. MAX(字段)加0与不加0的测试

    --max(字段名)中的"字段名"的数据类型是字符型的,"字段名"+ 0后,oracle会隐式的转换成数字型 --测试 )); insert into Test ...

  7. 【转】Android 为什么 dp2px 或 px2dp 公式需要加 0.5f

    转自:http://blog.csdn.net/changcsw/article/details/52440543 网上 dp2px 和 px2dp 公式: public static int px2 ...

  8. php格式化数字:位数不足前面加0补足

    <?php $var=sprintf("%02d", 2);//生成2位数,不足前面补0 echo $var;//结果为02 ?> 參考:https://blog.cs ...

  9. python-----重命名文件(在原文件名前加0)

    问题描述: 如果用循环给文件命名,则文件名就会是1,2,3...,10,11,12,13...,100,101...,但是遍历这些文件时,顺序就会变成1,10,100,101,...109,11,.. ...

随机推荐

  1. ORACLE 坏块的模拟和查看

    坏块的模拟和查看使用bbed工具修改数据文件的块,然后使用dbv和rman工具查看坏块. 1.创建数据:根据dbv查看没有坏块Total Pages Marked Corrupt : 0create ...

  2. Java-多态(上)

    什么是多态 同一方法可以根据发送对象的不同而采取多种不同的行为方式 一个对象实际类型是确定的 但指向其引用类型却有很多 注意事项 多态是方法的多态 属性没有多态 父类和子类 有联系 类型转换异常 Cl ...

  3. 改头换面为哪般,最像Android的Windows——Win11升级安装体验

    在过完了十一小长假之后,各位打工人.学僧党可期待的不仅仅是新一轮的工作,Windows11也在10月5日悄悄正式发布,正式版已经面向MSDN订阅用户开放下载. 作为微软金牌合作伙伴,本葡萄已在第一时间 ...

  4. MySQL ENGINES 引擎

    引擎 存储引擎是数据库底层软件组织. 数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据. 不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能. MySQL的核心就是存储引擎 ...

  5. appium启动ios系统上面的app需求的参数

    Appium启动APP至少需要7个参数  'platformVersion','deviceName'.'udid'.'bundleId'.'platformName'.'automationName ...

  6. 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

    序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...

  7. 【转载】[经验] 嵌入式stm32实用的排序算法 - 交换排序

    Ⅰ.写在前面 前面写了关于ADC采集电压的文章,大家除了求平均的方式来处理采样值,还有没有使用到其他的方式来处理采集值呢? 在某些情况下就需要对一组数据进行排序,并提取头特定的数据出来使用. 排序的应 ...

  8. Abp VNext分表分库,拒绝手动,我们要happy coding

    Abp VNext 分表分库 ShardingCore ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本, ...

  9. 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现

    pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...

  10. Noip模拟14 2021.7.13

    T1 队长快跑 本身dp就不强的小马看到这题并未反映过来是个dp(可能是跟题面太过于像那个黑题的队长快跑相似) 总之,基础dp也没搞出来,不过这题倒是启发了小马以后考试要往dp哪里想想 $dp_{i, ...