\(\mathcal{Description}\)

  Link.

  读题时间≈想题时间,草。(

  给定 \(N,K,M\),对于每个 \(x\in[1,N]\) 的整数 \(x\),统计多重集 \(\{s\}\) 的个数,使得集合元素的平均数为 \(x\),且满足对于任意 \(i\), \(s_i\in[1,N]\) 且 \(\sum_j[s_i=s_j]\le K\),即相同元素至多出现 \(K\) 次。答案对 \(M\) 取模。

  \(N,K\le100\)。

\(\mathcal{Solution}\)

  首先,看到“平均数”“中位数”之类的 AtCoder 比较喜欢的东西,肯定要进行转化。这里可以转化为“偏移量”:假设已钦定平均数 \(x\),那么一个元素 \(v\) 的贡献就是 \(v-x\),最终满足贡献和为 \(0\) 即可。对于任意多重集 \(\{s\}\),记 \(i\) 在其中出现的次数为 \(k_i~(i\in[1,N])\),那么:

\[\begin{aligned}
&\sum_{i=1}^nik_i=x|\{s\}|\\
\Leftrightarrow &\sum_{i=1}^n(i-x)k_i=0\\
\Leftrightarrow &\sum_{i=1}^{x-1}(x-i)k_i=\sum_{i=x+1}^n(i-x)k_i
\end{aligned}
\]

  写着形象点就是满足:

\[k_{x-1}+2k_{x-2}+\cdots+(x-1)k_1=k_{x+1}+2k_{x+2}+\cdots+(n-x)k_n
\]

  然后非常 amazing 地发现等号左右描述的是同一形式的问题:求 \(\{k_n\}\) 的个数,使得 \(\sum_{i=1}^nik_i=s\),且满足 \(k_i\in[0,K]\),其中 \(n,s\) 是形式参数。这个问题显然可以 DP:令 \(f(i,j)\) 表示 \(\sum_{t=1}^itk_t=j\) 的方案数,枚举新加入的 \(k_{i+1}\) 的值即可转移。

  第一维大小显然为 \(n\),考虑第二维的大小,我们只需要求出能使等式左右两边同时取到的 \(j\) 值。所以 \(j\le K(1+2+\cdots+\lfloor\frac{n}2\rfloor)\)。

  最后,求答案时,枚举等式左右同时取到的值,乘法原理乘起来,别忘了乘上 \(k_x\) 的 \(K+1\) 种取值,在减去空集的 \(1\)。(真啰嗦 owo。

  总复杂度 \(\mathcal O(N^3K)\) 带小于 \(\frac{1}8\) 的巨小常数(有问题欢迎指出 w),DP 建议刷表,考虑到无用状态数较多,跑得可快啦!

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>

inline void wint ( int x ) {
if ( 9 < x ) wint ( x / 10 );
putchar ( x % 10 ^ '0' );
} const int MAXN = 100;
int N, K, M, f[MAXN + 1][MAXN * ( MAXN / 2 + 1 ) * ( MAXN >> 1 ) / 2 + 5]; inline void addeq ( int& a, const int b ) { ( a += b ) < M ? 0 : a -= M; } inline void initDP () {
f[0][0] = 1;
int sbound = K * ( N / 2 + 1 ) * ( N >> 1 ) >> 1;
for ( int i = 0; i < N; ++ i ) {
for ( int j = 0, cur; j <= sbound; ++ j ) {
if ( !( cur = f[i][j] ) ) continue;
for ( int k = 0, s = j; k <= K && s <= sbound; ++ k, s += i + 1 ) {
addeq ( f[i + 1][s], cur );
}
}
}
} inline int solve ( const int x ) {
// k[x-1]+2k[x-2]+...+(x-1)k[1] = k[x+1]+2k[x+2]+...+(n-x)k[n].
int sbound = x - 1 < N - x ? x - 1 : N - x, ret = 0;
sbound = K * sbound * ( sbound + 1 ) >> 1;
for ( int s = 0; s <= sbound; ++ s ) {
addeq ( ret, 1ll * f[x - 1][s] * f[N - x][s] % M );
}
return ( ret * ( K + 1ll ) % M + M - 1 ) % M;
} int main () {
scanf ( "%d %d %d", &N, &K, &M );
initDP ();
for ( int i = 1; i <= N; ++ i ) {
wint ( solve ( i ) );
putchar ( '\n' );
}
return 0;
}

Solution -「ARC 104D」Multiset Mean的更多相关文章

  1. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  2. Solution -「ARC 101D」「AT4353」Robots and Exits

    \(\mathcal{Description}\)   Link.   有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ...

  3. Solution -「ARC 110D」Binomial Coefficient is Fun

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...

  4. Solution -「ARC 124E」Pass to Next

    \(\mathcal{Description}\)   Link.   有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...

  5. Solution -「ARC 126E」Infinite Operations

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),定义一次操作为: 选择 \(a_i<a_j\),以及一个 \(x\in\mathbb R ...

  6. Solution -「ARC 126F」Affine Sort

    \(\mathcal{Description}\)   Link.   给定 \(\{x_n\}\),令 \[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k ...

  7. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  8. Solution -「ARC 125E」Snack

    \(\mathcal{Description}\)   Link.   把 \(n\) 种零食分给 \(m\) 个人,第 \(i\) 种零食有 \(a_i\) 个:第 \(i\) 个人得到同种零食数量 ...

  9. Solution -「ARC 058C」「AT 1975」Iroha and Haiku

    \(\mathcal{Description}\)   Link.   称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...

随机推荐

  1. reduce/reduceRight

    使用 reduce 和 reduceRight 方法可以汇总数组元素的值,具体用法如下: reduce function appendCurrent (previousValue, currentVa ...

  2. react 网址导航

    项目搭建 使用webpack.babel.react.antdesign配置单页面应用开发环境

  3. css处理工具PostCss

    在 Web 应用开发中,CSS 代码的编写是重要的一部分.CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中.这给开发人员带来了效率上 ...

  4. 【记录一个问题】linux下使用opencv中的UMat,性能并未提升,反而略有下降

    使用后性能略微下降,一开始怀疑是UMat拷贝的问题.运行 nvidia-smi -l 1, 发现GPU占用始终为0.说明opencl使用的是CPU版本,而不是GPU版本.明天试验opencl的GPU版 ...

  5. Cesium中级教程8 - Introduction to Particle Systems 粒子系统入门

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ What is a particle system? 什么是粒子 ...

  6. python技巧一行命令搞定局域网共享

    python超强玩法--一行命令搞定局域网共享 ​ 今天刷到python的一个新玩法,利用python自带的http服务,快速创建局域网共享服务,命令如下: python -m thhp.server ...

  7. 如何理解python中的cmp_to_key()函数

    cmp_to_key() 在functools包里的函数,将老式的比较函数(cmp function)转化为关键字函数(key function). 与接受key function的工具一同使用(如 ...

  8. golang反射reflect机制用法

    package main import ( "fmt" "reflect" ) type User struct { Id int Name string Ag ...

  9. iPhone12和iPhone12pro的区别有什么?

    阅读全部 说法一 iPhone12和iPhone12pro的区别有:颜色.价格.运行内存.拍照.屏幕最高亮度.电池容量.材质.重量等,具体对比如下: 颜色:iPhone12五色可选,青春绚丽:iPho ...

  10. es6 快速入门 系列 —— 类 (class)

    其他章节请看: es6 快速入门 系列 类 类(class)是 javascript 新特性的一个重要组成部分,这一特性提供了一种更简洁的语法和更好的功能,可以让你通过一个安全.一致的方式来自定义对象 ...