题目
题目描述
在美丽的蓝星上,生活着三种函数:
μ
,
I
,
i
d
k
\mu,\;I,\;id_k
μ,I,idk 。它们三个都是大家熟知的数论函数,想必我不需要把
{
μ
(
p
1
t
1
p
2
t
2
⋯
p
k
t
k
)
=
[
max
(
t
i
)
≤
1
]
(
−
1
)
k
I
(
n
)
=
1
i
d
k
(
n
)
=
n
k
(
k
∈
N
+
)
\begin{cases} \mu(p_1^{t_1}p_2^{t_2}\cdots p_k^{t_k})=[\max(t_i)\le 1] (-1)^{k}\\ I(n)=1\\ id_k(n)=n^k\;(k\in\N^+) \end{cases}
⎩⎪⎨⎪⎧μ(p1t1p2t2⋯pktk)=[max(ti)≤1](−1)kI(n)=1idk(n)=nk(k∈N+)
这种基础的定义写出来。然而这一天,蓝星上来了一个
p
r
i
n
c
i
p
a
l
\rm principal
principal,他带来了卷!当
f
,
g
f,g
f,g 卷在一起时,它们会得到
h
(
n
)
=
∑
d
∣
n
f
(
d
)
⋅
g
(
n
d
)
h(n)=\sum_{d|n}f(d)\cdot g\left({n\over d}\right)
h(n)=d∣n∑f(d)⋅g(dn)
卷的威力,恐怖至极!这三种基础函数卷来卷去,卷出了一个新函数 F ( n ) F(n) F(n),长相怪异,谁也不知道它是个啥。别担心!你作为反卷协会的会长,相当清楚他的弱点:质数。你早就证明过,对于任取的某个 c c c,存在一个多项式 G ( x ) G(x) G(x),使得对于任意质数 p p p 都满足 F ( p c ) = G ( p ) F(p^c)=G(p) F(pc)=G(p) 。
你安插在 p r i n c i p a l \rm principal principal 身边的卧底,代号 l i t t l e s c i s s o r \rm little\;scissor littlescissor 的,冒着被校长开除的风险,告诉了你一个 c c c 和对应的 G ( p ) G(p) G(p) 。为了不打草惊蛇,你只要说出 F ( p d ) F(p^d) F(pd) 对应的 G ( x ) G(x) G(x) 来警告一下他。可惜的是,数据传输量太大,你得到的信息和输出的结果都必须取模 998244353 998244353 998244353 。
显然 F ( n ) F(n) F(n) 应该是不超过 1 0 5 10^5 105 个基础函数卷出来的。如果你发现不存在这样的 F ( n ) F(n) F(n),就告诉 l i t t l e s c i s s o r \rm little\;scissor littlescissor 吧,但是请不要责备他。如果有多个可能的 F ( p d ) F(p^d) F(pd) 对应的 G ( x ) G(x) G(x),请输出最小的一个(取模后比较大小)。多项式 A ( x ) A(x) A(x) 小于 B ( x ) B(x) B(x) 当且仅当 ∣ A ( x ) B ( x ) ∣ |\frac{A(x)}{B(x)}| ∣B(x)A(x)∣ 在 x → + ∞ x\rightarrow +\infty x→+∞ 时收敛于一个小于 1 1 1 的值。
数据范围与提示
1
≤
d
≤
c
≤
100
1\le d\le c\le 100
1≤d≤c≤100 且
G
(
x
)
G(x)
G(x) 的次数
n
∈
[
0
,
1000
]
n\in[0,1000]
n∈[0,1000] 。
思路
狄利克雷卷积满足结合律、交换律、分配律。那么 F ( p c ) F(p^c) F(pc) 可以看成把次数 c c c 分配到每个基础函数上面去,然后乘起来。
题目中暗示过的, F ( p c ) F(p^c) F(pc) 总是可以写成 G ( p ) G(p) G(p),其原理就是 μ ( p c ) ∈ { 1 , − 1 , 0 } \mu(p^c)\in\{1,-1,0\} μ(pc)∈{1,−1,0},而 i d k ( p c ) = p c k id_k(p^c)=p^{ck} idk(pc)=pck,二者相乘再加上别的肯定是 p p p 的多项式。可以认为 I = i d 0 I=id_0 I=id0 。
于是,如果把 p c p^c pc 分配出去,得到的最高次项肯定是 c m cm cm,其中 i d m id_m idm 是最大的 i d id id 函数的下标。于是 m = n c m=\frac{n}{c} m=cn 被首先确定(不整除则无解)。
然后 i d m id_m idm 用了多少个呢?假设是 x m x_m xm 个,那么将 c c c 分给 x m x_m xm 个盒子,方案数是 ( c + x m − 1 x m − 1 ) {c+x_m-1\choose x_m-1} (xm−1c+xm−1),必须是最高次项的系数,因为这是唯一可以得到 c m cm cm 次项的方法。
x m − 1 x_{m-1} xm−1 又不会算了。先假设 μ \mu μ 不存在,我们可不可以模仿上面的方法,找到某一项,利用这一项的系数来确定 x m − 1 x_{m-1} xm−1 呢?我们必须确保,一旦使用了 i d m − 2 id_{m-2} idm−2 或者更小的 i d id id,就不能贡献到这一项了。可以被 i d m − 2 id_{m-2} idm−2 或更低的 i d id id 乘出来的,无非就是 1 1 1 分给 m − 2 m-2 m−2 后 c − 1 c-1 c−1 分给 m m m 嘛。也就是 m ( c − 1 ) + m − 2 m(c-1)+m-2 m(c−1)+m−2 嘛。加一就是我们想要的:第 c m − 1 cm-1 cm−1 项。
类似的分析,第 ( c − 1 ) m + i (c-1)m+i (c−1)m+i 项就可以用来计算 x i x_i xi 。我们只需要求出,不用 i d i id_i idi 时得到的这一项的系数 f f f,那么 x i ⋅ ( c − 1 + x m − 1 x m − 1 ) + f x_i\cdot{c-1+x_m-1\choose x_m-1}+f xi⋅(xm−1c−1+xm−1)+f 就必须是这一项的系数。这里的 x i x_i xi 乘组合数很好理解: x i x_i xi 中选一个,剩下的分配给 x m x_m xm 个盒子。这是关于 x i x_i xi 的线性方程,唯一确定!
那么 f f f 怎么算呢?用一个 d p \tt dp dp 就行了。 f ( i , j , k ) f(i,j,k) f(i,j,k) 表示只用 i d i id_i idi 或者更大的 i d id id,已经从 c c c 中分配了 j j j 出去,贡献到 k k k 次项。这个 d p \tt dp dp 转移很简单,枚举在 i d i − 1 id_{i-1} idi−1 上分配的指数,乘一个组合数就转移到 k + ( i − 1 ) × w h a t k+(i-1)\times what k+(i−1)×what 了。
这个计算 f f f 是 O ( m c n ⋅ c ) = O ( n 2 c ) \mathcal O(mcn\cdot c)=\mathcal O(n^2c) O(mcn⋅c)=O(n2c) 的。感觉挺大,但是这就是正解,有啥办法呢 😕
那么 μ \mu μ 存在呢?显然 i d 0 id_0 id0 就不存在了,因为二者互为逆元。由于 μ \mu μ 与 i d 0 id_0 id0 是同阶的,都是 p 0 p^0 p0 级别,所以对于前面的过程没有任何差别。只有最后一步,关于 x 0 x_0 x0 的方程中, x 0 x_0 x0 添了一个负号,然后计算 f ( 0 , j , k ) f(0,j,k) f(0,j,k) 时组合数有所变化,是直接 x 0 x_0 x0 中选出 d i s t r i b u t i o n \rm distribution distribution 个,并且可能乘一个 − 1 -1 −1 。
答案又是啥呢?注意到 d ≤ c d\le c d≤c,其实答案就是 f ( 0 , d ) f(0,d) f(0,d) 啊,多么巧妙!
最后剩下一些边边角角的问题: x m x_m xm 怎么求?答案:暴力。因为 ∑ x ≤ 1 0 5 \sum x\le 10^5 ∑x≤105 。并且事实上确实可能多解,但是最多 3 3 3 个解(题解声称打表发现了这一点),都做一遍。(而且这 3 3 3 个 x m x_m xm 并不总是有解。)
另: ∣ A ( x ) B ( x ) ∣ |{A(x)\over B(x)}| ∣B(x)A(x)∣ 是我修改过的题面。我希望我没有搞错。原题目是:
- A ( x ) A(x) A(x) 的次数小于 B ( x ) B(x) B(x) 则 A ( x ) A(x) A(x) 小于 B ( x ) B(x) B(x) 。
- A ( x ) , B ( x ) A(x),B(x) A(x),B(x) 次数相同,那么从最高次项开始,依次比较系数,第一处系数不同时是 A ( x ) A(x) A(x) 的系数更小。
还有一个容易忽略的情况是 n = 0 n=0 n=0 。此时是 μ k \mu^k μk 或者 i d 0 × i d 0 × i d 0 × ⋯ × i d 0 id_0\times id_0\times id_0\times\cdots\times id_0 id0×id0×id0×⋯×id0 得到的结果,大家肯定都很会做。