\(\mathcal{Description}\)

  Link.

  求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\exist i\in[1,n),~\max_{j=1}^i\{a_j\}=\min_{j=i+1}^n\{a_j\}\),答案对大素数 \(p\) 取模。

  \(n\le400\),\(m\le10^8\)。

\(\mathcal{Solution}\)

  前几天刚胡了一个 "DP and DP" 的 trick,这不又遇见一道。(

  注意到 \(m\) 很大,一副拒 DP 状态于千里之外的样子,尝试先回避它——将某个合法 \(\lang a_n\rang\) 离散化,此时值域不超过 \([1,n]\)。但“离散化”又要求值域中每个位置出现,那我们折中:只要求值域为 \([1,n]\),而不限制每个位置出现。可是为了将值域还原为 \([1,m]\),我们又势必得知“有多少个合法 \(\lang a_n\rang\),其中 \(a\) 有 \(x\) 种不同取值”。

  一步步来,先考虑求出 \(f(i,j)\),表示长度为 \(i\) 的序列,值域在 \([1,j]\) 时的合法数量。总数减去不合法数,枚举最后一个不合法位置 \(k-1\),以及此时前缀 \(\max\) 和后缀 \(\min\) 的值 \(t\),可以发现 \(a_{k..n}\) 构成子问题,得到转移

\[f(i,j)=j^i-\sum_{k=2}^i\sum_{t=1}^j(t^{k-1}-(t-1)^{k-1})(f(i-k+1,j-t+1)-f(i-k+1,j-t)).
\]

合理处理系数的指标和转移状态的下标,可以利用前缀和将求 \(f\) 的过程优化至 \(\mathcal O(n^3)\)。

  如刚才透露的一般,我们在目标状态 \(f(n,1..n)\) 的基础下求“有 \(x\) 个不同取值”。令 \(g(i)\) 表示长度为 \(n\) 的序列中,离散化后满足值域恰为 \([1,i]\) 的合法数量,简单地

\[g(i)=f(n,i)-\sum_{j=1}^{i-1}\binom{i}{j}g(j).
\]

  答案变得显而易见

\[\textit{answer}=\sum_{i=1}^n\binom{m}{i}g_i.
\]

其中组合数展开成下降幂暴力算即可。总复杂度 \(\mathcal O(n^3)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 400;
int n, m, P, fac[MAXN + 5], ifac[MAXN + 5];
int pwr[MAXN + 5][MAXN + 5], ipwr[MAXN + 5][MAXN + 5];
int f[MAXN + 5][MAXN + 5], g[MAXN + 5]; inline int mul( const int a, const int b ) { return 1ll * a * b % P; }
inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += P ); }
inline int add( int a, const int b ) { return ( a += b ) < P ? a : a - P; }
inline void addeq( int& a, const int b ) { ( a += b ) >= P && ( a -= P ); }
inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + P : a; }
inline int mpow( int a, int b ) {
int ret = 1;
for ( ; b; a = mul( a, a ), b >>= 1 ) ret = mul( ret, b & 1 ? a : 1 );
return ret;
} inline void init() {
fac[0] = 1;
rep ( i, 1, n ) fac[i] = mul( i, fac[i - 1] );
ifac[n] = mpow( fac[n], P - 2 );
per ( i, n - 1, 0 ) ifac[i] = mul( i + 1, ifac[i + 1] ); rep ( i, 0, n ) {
pwr[i][0] = ipwr[i][0] = 1;
ipwr[i][1] = mpow( pwr[i][1] = i, P - 2 );
rep ( j, 2, n ) {
pwr[i][j] = mul( i, pwr[i][j - 1] );
ipwr[i][j] = mul( ipwr[i][j - 1], ipwr[i][1] );
}
}
} inline int comb( const int a, const int b ) {
return a < b ? 0 : mul( fac[a], mul( ifac[b], ifac[a - b] ) );
} int main() {
scanf( "%d %d %d", &n, &m, &P ), init(); rep ( j, 1, n ) {
static int sum[MAXN + 5][2];
rep ( i, 1, n ) sum[i][0] = sum[i][1] = 0;
rep ( i, 1, n ) {
int& cur = f[i][j] = pwr[j][i];
rep ( t, 1, j ) {
subeq( cur, mul( pwr[t][i], sum[t][0] ) );
addeq( cur, mul( pwr[t - 1][i], sum[t][1] ) );
}
rep ( t, 1, j ) {
addeq( sum[t][0], mul( ipwr[t][i],
sub( f[i][j - t + 1], f[i][j - t] ) ) );
addeq( sum[t][1], mul( ipwr[t - 1][i],
sub( f[i][j - t + 1], f[i][j - t] ) ) );
}
}
} int ans = 0, c = 1;
rep ( i, 1, n ) {
int& cur = g[i] = f[n][i];
rep ( j, 1, i - 1 ) subeq( cur, mul( comb( i, j ), g[j] ) );
c = mul( c, mul( m - i + 1, ipwr[i][1] ) );
addeq( ans, mul( c, g[i] ) );
}
printf( "%d\n", ans );
return 0;
}

Solution -「Gym 102956B」Beautiful Sequence Unraveling的更多相关文章

  1. Solution -「Gym 102979E」Expected Distance

    \(\mathcal{Description}\)   Link.   用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...

  2. Solution -「Gym 102979L」 Lights On The Road

    \(\mathcal{Description}\)   Link.   给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...

  3. Solution -「Gym 102956F」Find the XOR

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...

  4. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  5. Solution -「Gym 102956A」Belarusian State University

    \(\mathcal{Description}\)   Link.   给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元 ...

  6. Solution -「Gym 102798I」Sean the Cuber

    \(\mathcal{Description}\)   Link.   给定两个可还原的二阶魔方,求从其中一个状态拧到另一个状态的最小步数.   数据组数 \(T\le2.5\times10^5\). ...

  7. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

  8. Solution -「Gym 102798E」So Many Possibilities...

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\) 和 \(m\),每次随机在 \(\{a\}\) 中取一个非零的 \(a_i\)(保证存 ...

  9. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

随机推荐

  1. nginx安装,手动源码安装

    什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ra ...

  2. js 关于replace() 的使用心得

    1.前言 我想把一段话 let a = "抱歉,您当前的主治医生有紧急情况不得不下班,您的预约将由<br>医生:里斯<br>为您就诊,<br>诊室位置:门 ...

  3. LINUX学习-PHP安装

    一.安装环境 操作系统CentOS6.8 关闭SeLinux和iptables防火墙 二.网络yum源 将下面的软件下载到  /etc/yum.repos.d/   的目录下 官方基础:http:// ...

  4. HIVE优化学习笔记

    概述 之前写过关于hive的已经有两篇随笔了,但是作者依然还是一枚小白,现在把那些杂七杂八的总结一下,供以后查阅和总结.今天的文章介绍一下hive的优化.hive是好多公司都在使用的东西,也有好多大公 ...

  5. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  6. Jquery操作文本内容(三个方法:html()、text()、var())

    Jquery操作文本内容(三个方法:html().text().var()) 一.html()获取和设置文本内容和标签 1.获取标签里的结构和内容 $("ul").html() / ...

  7. winform GDI+ 抗锯齿

    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

  8. 雷柏鼠标vt350Q配对

    vt350q 闲鱼捡了个垃圾vt350q,23元,无接收器,不知道好坏 鼠标线 拿到手插上线没法用,后来用了罗技anywhere2s的线可以,原来usb鼠标线是五根. 鼠标毛病 使用后发现滚轮有时候乱 ...

  9. 用Python实现一个Picgo图床工具

    PyPicGo PyPicGo 是一款图床工具,是PicGo是Python版实现,并支持各种插件自定义插件,目前PyPicGo自带了gitee.github.SM.MS和七牛云图传,以及rename. ...

  10. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...