EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P3702 [SDOI2017] 序列计数

题目描述

Alice 想要得到一个长度为 n 的序列,序列中的数都是不超过 m 的正整数,而且这 n 个数的和是 p 的倍数。

Alice 还希望,这 n 个数中,至少有一个数是质数。

Alice 想知道,有多少个序列满足她的要求。

输入格式

一行三个数,n,m,p

输出格式

一行一个数,满足 Alice 的要求的序列数量,答案对 20170408 取模。

输入输出样例 #1

输入 #1

1
3 5 3

输出 #1

1
33

说明/提示

20% 的数据,1n,m100

50% 的数据,1m100

80% 的数据,1m106

100% 的数据,1n109,1m2×107,1p100

题解

一道生成函数练手题。当然你也可以使用动态规划或其他计数方法来做。

对于“至少有一个数是质数”这一限制,我们考虑补集转化,即用全部方案减去不含任何质数的方案。

发现 p 的数据范围相当小,我们希望能在 modp 的同余系下进行计数。

定义多项式 fk(x),其中 xi 的系数 ai 为长度为 k 的序列且和 modpi 的方案数。

利用生成函数卷积,则有:

fk+m(x)=fk(x)×fm(x)

我们只要先构造出 f1(x),再求出其 n 次方即可得到想要的答案。