洛谷P3321 [SDOI2015]序列统计(NTT)】的更多相关文章

传送门 题意:$a_i\in S$,求$\prod_{i=1}^na_i\equiv x\pmod{m}$的方案数 这题目太珂怕了……数学渣渣有点害怕……kelin大佬TQL 设$f[i][j]$表示$\prod_{k=1}^ia_k\equiv j\pmod{m}$的方案数 那么$$f[2*i][j]=\sum_{ab\equiv j\pmod{m}}f[i][a]f[i][b]$$ 然后因为$m$是质数.质数有一个叫做原根的东西,质数$p$的原根$g$满足$g^i\ mod\ p$在$i$为…
题目大意:给你一个集合$n,m,x,S(S_i\in(0,m],m\leqslant 8000,m\in \rm{prime},n\leqslant10^9)$,求一个长度为$n$的序列$Q$,满足$Q_i\in S$,且$\prod\limits _{i=1}^nQ_i=x$,求序列的个数 题解:乘比较麻烦,可以把每个数求$\ln$,可以求出$m$的原根,求原根可以暴力$O(m^2)$求,然后每个数求$\ln$,求出生成函数$F(x)$,算出$F^n(x)$.发现$n$较大,多项式快速幂即可.…
显然dp就是设\(f[i][j]\)表示dp了i轮,对m取膜是j的方案数 \(f[i][xy\mod m]=f[i-1][x]\times f[i-1][y]\) 这是\(O(nm^2)\)的 像我这样的蒟蒻都能想到用类似快速幂一样的东西来转移是吧,那么就\(O(log_2 nm^2)\)了 非常难受,还是过不去 如果可以优化一下dp转移就好了,比如把乘改成加,就能用NTT了 然后就要用到一个叫做原根的东西,学NTT的时候只是记了一下不知道这货有啥用 质数\(m\)原根\(g\)的性质:对\(m…
懒得放传送[大雾 有趣的一道题 前几天刚好听到Creed_神犇讲到相乘转原根变成卷积的形式 看到这道题当然就会做了啊w 对于m很小 我们暴力找原根 如果你不会找原根的话 出门左转百度qwq 找到原根以后所有数转成原根的幂次然后卷积就吼了啊 多项式卡速米 由于是循环卷积所以每一次还要转回系数相加再转回来 所以是不优美的O(nlg^2n) =v= 代码在这里. //Love and Freedom. #include<cstdio> #include<cstring> #include…
[BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个.小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi.另外,小C认为这个问题的答案可能…
3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1155  Solved: 532[Submit][Status][Discuss] Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中…
题目 [SDOI2015]序列统计 挺好的题!!! 做法 \(f[i][j]\)为第\(i\)个数前缀积在模\(M\)意义下为\(j\) 显然是可以快速幂的:\[f[2*i][j]=\sum\limits_{ab\equiv j(mod~ M)}f[i][a]\cdot f[i][b]\] 时间复杂度\(O(m^2 log n)\) 考虑转换到对数上则可以化乘为加,而\(M\)为质数,原根\(g\)的\(g_0^{m-2}\)恰好对应\([1,m-1]\) 我们用这些代替数\(g^A\equiv…
[题意]给定一个[0,m-1]范围内的数字集合S,从中选择n个数字(可重复)构成序列.给定x,求序列所有数字乘积%m后为x的序列方案数%1004535809.1<=n<=10^9,3<=m<=8000,m为素数,1<=x<=m-1.(个人认为题意修改错误) [算法]NTT+生成函数+离散对数+快速幂 [题解]由Πai=x(%m),可得Σlog ai=log x(%(m-1)),其中log以m的原根g为底. 所以通过将集合S和x对m取离散对数,将乘积转化为和,从而方便生成…
题意 题目链接 给出大小为\(S\)的集合,从中选出\(N\)个数,满足他们的乘积\(\% M = X\)的方案数 Sol 神仙题Orz 首先不难列出最裸的dp方程,设\(f[i][j]\)表示选了\(i\)个数,他们的乘积为\(j\)的方案数 设\(g[k] = [\exists a_i = k]\) 转移的时候 \[f[i + 1][(j * k) \% M] += f[i][j] * g[k]\] 不难发现每次的转移都是相同的,因此可以直接矩阵快速幂,时间复杂度变为\(logN M^2\)…
思路 首先有个挺显然的DP \[ dp[i][(j*k)\%m]+=dp[i-1][j]\times dp[i-1][k] \] 想办法优化这个DP 这个dp也可以写成这样 \[ dp[i][j]=\sum_{p*q=j}dp[i-1][p]\times dp[i-1][q] \] 看着一副卷积的样子 但是是乘法,可以考虑转化乘法为加法,有两种方式,取ln或者原根 注意到m是质数,所以取原根,每层之间的转移就变成卷积了 但是这题的卷积下标是模m的,所以每次乘完都要把大于m-1的加到对应项上(i+…