题目:一段长为i的项链有a[i]种表达爱意的装饰方法,问长度为n的项链有多少种用上述方式组成的方法。
思路:dp[i]=∑dp[j]*a[i-j],(1<=j<=i-1)
要用fft+CDQ分治
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //#define PI acos(-1.0) #define LL long long #define ULL unsigned long long #define INF 0x3f3f3f3f3f3f3f3f #define mm(a,b) memset(a,b,sizeof(a)) #define PP puts("*********************"); template T f_abs(T a){ return a > 0 ? a : -a; } template T gcd(T a, T b){ return b ? gcd(b, a%b) : a; } template T lcm(T a,T b){return a/gcd(a,b)*b;} // 0x3f3f3f3f3f3f3f3f // 0x3f3f3f3f const int maxn=200050; const int mod=313; const double PI=acos(-1.0); struct Complex{//复数结构体 double x,y; Complex(double _x=0.0,double _y=0.0){ x=_x; y=_y; } Complex operator-(const Complex &b)const{ return Complex(x-b.x,y-b.y); } Complex operator+(const Complex &b)const{ return Complex(x+b.x,y+b.y); } Complex operator*(const Complex &b)const{ return Complex(x*b.x-y*b.y,x*b.y+y*b.x); } }; /* *进行FFT和IFFT前的反转变换. *位置i和 (i二进制反转后位置)互换 *len必须是2的幂 */ void change(Complex y[],int len){ int i,j,k; for(i=1,j=len/2;i=k){ j-=k; k/=2; } if(j>1; cdq(L,mid); int len=1; while(len<(R-L+1)) len<<=1; for(int i=0;i