关于FFT(思路来源+板子整理)

思路来源

FFT详解

https://blog.csdn.net/ggn_2015/article/details/68922404

FFT代码

https://blog.csdn.net/hlyfalsy/article/details/9938547

https://blog.csdn.net/XieNaoban/article/details/69486299

FFT+NTT的理解

https://blog.csdn.net/qq_37136305/article/details/81184873

关于蝴蝶操作

https://blog.csdn.net/JuneWindy/article/details/79156335

关于IDFT矩阵的逆的证明

https://blog.csdn.net/f_zyj/article/details/76037583

FFT例题 3idiots

http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html

牛客十一赛例题 FFT+原根

https://blog.csdn.net/u013534123/article/details/82919834

感谢这么多答主,让我用了10h终于理解了FFT。

分治FFT模板

#include 
using namespace std;
typedef long long LL;
const int N=1<<18,mod=1e5+3;
double PI=acos(-1.0);
 
int n,a,q,k;
int c[N],s[N];
 
struct C{
	double r,i;
	C(){}
	C(double a,double b){r=a,i=b;}
	C operator + (C x){return C(r+x.r,i+x.i);}
	C operator - (C x){return C(r-x.r,i-x.i);}
	C operator * (C x){return C(r*x.r-i*x.i,r*x.i+i*x.r);}
}w[N],A[N],B[N];
int R[N];
vector  colors[N<<1];
struct cmp{
	bool operator ()(int a,int b){
		return colors[a].size()>colors[b].size();
	}
};
priority_queue ,cmp> heap;
void FFT(C a[],int n){
	for (int i=0;i>1,d=1;d>=1)
		for (int i=0;i &a,vector  &b,vector  &c){
	int n,d;
	for (int i=0;i>1]>>1)|((i&1)<<(d-1));
		w[i]=C(cos(2*PI*i/n),sin(2*PI*i/n));
	}
	for (int i=a.size();i>=1,x=1ll*x*x%mod)
	if(n&1)res=1ll*res*x%mod;
	return res;
}
int main(){
	scanf("%d%d%d",&n,&a,&q);
	for(int i=1;i<=n;++i)
	scanf("%d",&s[i]);
	while (!heap.empty())
		heap.pop();
	int sz=0;
	for (int i=1;i<=n;i++){
		colors[++sz].clear();
		colors[sz].push_back(modpow(a,s[i],mod));
		colors[sz].push_back(1);
		heap.push(sz);
	}
	while (heap.size()>=2){
		int x=heap.top();
		heap.pop();
		int y=heap.top();
		heap.pop();
		FFT_times(colors[x],colors[y],colors[++sz]);
		colors[x].clear(),colors[y].clear();
		heap.push(sz);
	}
	c[0]=1;//C(n,0)
	for(int i=1;i<=n;++i)
	c[i]=1ll*c[i-1]*(n-i+1)%mod*modpow(i,mod-2,mod)%mod;
	int inv=modpow(1-a+mod,mod-2,mod);
	for(int i=1;i<=q;++i)
	{
		scanf("%d",&k);
		int res=(c[k]-colors[sz][n-k]+mod)%mod;
		res=1ll*res*inv%mod;
		printf("%d\n",res);
	}
	return 0;
}

 

你可能感兴趣的:(知识点总结)