给定整数 $x$,求所有可以生成出的数列,长度为$n$,且满足数列中所有数的乘积 $\mod m$ 的值等于 $x$ 的不同的数列的有多少个。
如果是加法没有$\%$就是$S$卷起来$n次$。
$f[i][j]$,表示$i$个元素乘积$\mod m=x$的方案数
为了将变成卷积的形式需要将乘法变成加法,,取个$log$即可,但如何处理$\mod m$,就需要知道$log_p x\%m$
假设$=i$
此时需要$p^i\%m\rightarrow i$一一对应,取原根即可。$g^1….g^{m-1},或者g^0….g^{m-2}$
转换完之后$f[1]$卷上$n$次,多项式快速幂。
- 本题中$0$无意义,就不存在$\mod m=0$的情况,$g^0与g^{m-1}$都是$1$,为了保证一一对应$log_g 1\%m=1$。
- 每次NNT需要吧多余的项加到$\%{m-1},g^i=g^{i+m-1}$上,如果取$g^{m-1}$,会有些麻烦。
- 注意数组清空
代码
1 |
|