HDU 4609 3-idiots

FFT计算卷积

#include
using namespace std;

const int MAXN=1<<18;
const long long mod=998244353;
const int G=3;
long long rev[MAXN],w[2][MAXN];
long long fac[MAXN],inv[MAXN];
long long A[MAXN];

long long powmod(long long x,long long p)
{
	long long ret=1;
	while(p)
	{
		if(p&1)
			ret=ret*x%mod;
		x=x*x%mod;
		p>>=1;
	}
	return ret;
}

void init()
{
	fac[0]=1;
	for(int i=1;i=0;i--)
		inv[i]=inv[i+1]*(i+1)%mod;
}

void initfft(int n)
{
	int i,k,x,y,v,dv;
	for(i=0;i<=n-1;i++)
	{
		x=i;
		y=0;
		for(k=1;k>=1)
			(y<<=1)|=(x&1);
		rev[i]=y;
	}
	v=powmod(G,(mod-1)/n);
	dv=powmod(v,mod-2);
	w[0][0]=w[1][0]=1;
	for(i=1;i<=n-1;i++)
	{
		w[0][i]=w[0][i-1]*v%mod;
		w[1][i]=w[1][i-1]*dv%mod;
	}
}

inline void fft(long long *A,int n,int ff)
{
	int i,j,k,t,l,v,x,y;
	for(i=0;i<=n-1;i++)
	{
		if(i>1];
			A[i]>>=1;
		}
		tmp=0;
		sum=0;
		for(i=1;i


你可能感兴趣的:(----FFT类,----HDU)