算法学习FFT系列(2):快速数论变换NTT &&bzoj3992: [SDOI2015]序列统计例题详解

bzoj3992: [SDOI2015]序列统计

Description

小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。
小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个。小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi。另外,小C认为这个问题的答案可能很大,因此他只需要你帮助他求出答案mod 1004535809的值就可以了。

Input

一行,四个整数,N、M、x、|S|,其中|S|为集合S中元素个数。第二行,|S|个整数,表示集合S中的所有元素。

Output

一行,一个整数,表示你求出的种类数mod 1004535809的值。

Sample Input

4 3 1 2
1 2

Sample Output

8

HINT

【样例说明】
可以生成的满足要求的不同的数列有(1,1,1,1)、(1,1,2,2)、(1,2,1,2)、(1,2,2,1)、(2,1,1,2)、(2,1,2,1)、(2,2,1,1)、(2,2,2,2)。
【数据规模和约定】
对于10%的数据,1<=N<=1000;
对于30%的数据,3<=M<=100;
对于60%的数据,3<=M<=800;
对于全部的数据,1<=N<=109,3<=M<=8000,M为质数,1<=x<=M-1,输入数据保证集合S中元素不重复

知识点:快速数论变换

其实学了FFT之后再学NTT已经只差临门一脚了。
首先复习一下FFT

复习FFT

离散型快速傅立叶变换如下
Xk=n=0N1xne2πiNnkk=0,1N1 X k = ∑ n = 0 N − 1 x n e − 2 π i N n k k = 0 , 1 ⋯ N − 1
离散型快速傅立叶逆变换如下
xn=1Nn=0N1Xke2πiNnkk=0,1N1 x n = 1 N ∑ n = 0 N − 1 X k e 2 π i N n k k = 0 , 1 ⋯ N − 1

引入NTT

如今快速数论变换是在 Zp Z p 上进行的。
快速傅立叶变换中,有一个神奇的单位复根叫做
ω=e2πiN ω = e − 2 π i N
这玩意儿有一个神奇的性质,就是 ωN=1 ω N = 1 并且 ωk ω k k=0,1N

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值