\(\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. js 关于replace() 的使用心得

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

  2. 方法覆盖 和toString方法的作用

    当我们代码怎么编写的时候,在代码级别上构成了方法的覆盖呢? 两个类必须要有继承关系. 重写之后的方法和之前的方法具有:相同的返回值类型 相同的方法名 相同的形参列表 访问权限不能更高,只能更低 重写之 ...

  3. [WPF] 用 Effect 实现线条光影效果

    1. 前言 几个月前 ChokCoco 大佬发布了一篇文章: CSS 奇技淫巧 | 妙用 drop-shadow 实现线条光影效果 在文章里实现了一个发光的心形线条互相追逐的效果: 现在正好有空就试试 ...

  4. java计算器(简单版)

    前言 之前在学习完Java的方法后,我发现自己可以开始写计算器这个"经典"的项目了,于是我花了一点时间写下了这个计算器的程序,也写下了这篇文章. 在这里,我需要说明一下,这个程序只 ...

  5. 乡亲们,我们创建了 Dapr 中文交流频道

    我们创建了 Dapr 中文交流 QQ 频道,欢迎大家加入!加入方式在文章最后一节. 为什么要创建频道? 解决什么问题 专业性,"你可以在我们群里面钓鱼,因为都是水" 你肯定加过非常 ...

  6. 学习axios必知必会(1)~axios基本介绍、axios配置、json-server接口模拟工具

    一.axios基本介绍 1.axios(前端最流行的 ajax 请求库) 特点: ① 基于 xhr + promise 的异步 ajax 请求库 ② 浏览器端/node 端都可以使用 ③ 支持请求/响 ...

  7. java输入年份和月份,输出天数

    import java.util.*; public class Demo { public static void main(String[] args){ int days = 0; Scanne ...

  8. Centos配置yum本地源最简单的办法

    有关centos配置yum本地源的方法 一.前提 先连接镜像 然后在命令行输入如下命令 mount /dev/sr0 /mnt cd /etc/yum.repos.d/ ls 之后会看到如下的界面 二 ...

  9. Android开发-页面绘制

    今天主要绘制了记账页面 记账页面用到的布局是TableLayout加Viewpager联动的方式,通过设置一个标题头可以实现页面的左右滑动,viewpager中添加两个fragment. 需要制作两个 ...

  10. JVM之栈、堆、方法区(三)

    一.CPU和内存的交互 今天除夕,祝大家新年快乐,其实,我们知道的,我们的CPU跟内存会有非常频繁的交互,因为如果这个频繁的交互是交给我们的磁盘的话,那么随着我们的CPU运转速度越来越快,那么我们的磁 ...