Live2D

Solution -「ARC 104D」Multiset Mean

Description

  Link.

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

  给定 N,K,M,对于每个 x[1,N] 的整数 x,统计多重集 {s} 的个数,使得集合元素的平均数为 x,且满足对于任意 isi[1,N]j[si=sj]K,即相同元素至多出现 K 次。答案对 M 取模。

  N,K100

Solution

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

i=1niki=x|{s}|i=1n(ix)ki=0i=1x1(xi)ki=i=x+1n(ix)ki

  写着形象点就是满足:

kx1+2kx2++(x1)k1=kx+1+2kx+2++(nx)kn

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

  第一维大小显然为 n,考虑第二维的大小,我们只需要求出能使等式左右两边同时取到的 j 值。所以 jK(1+2++n2)

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

  总复杂度 O(N3K) 带小于 18 的巨小常数(有问题欢迎指出 w),DP 建议刷表,考虑到无用状态数较多,跑得可快啦!

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;
}
posted @   Rainybunny  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示