#include #include #include #define PI2 6.28318530717958647692 typedef double complex cmplx; #define K 14 #define M (1<= mod) r -= mod; return r; /* rhs = mod-rhs; if(lhs >= rhs) return lhs - rhs; else return mod + lhs - rhs; */ } Zp sub(Zp lhs, Zp rhs){ if(lhs >= rhs) return lhs - rhs; else return mod + lhs - rhs; } Zp mul(Zp lhs, Zp rhs){ return ((unsigned long long) lhs * rhs) % mod; } Zp pos(Zp x){ if(x < 0) x += mod; return x; } cmplx PL[M]; cmplx PH[M]; cmplx QL[M]; cmplx QH[M]; cmplx w[M>>1]; void genw(int i, int b, long double complex z, cmplx *w){ if(b == 0) w[i] = z; else { genw(i, b>>1, z, w); genw(i|b, b>>1, z*w[b], w); } } void init(int k, cmplx *w){ int i, j; const int m = 1<>=1){ w[i] = cexp(I * (arg * j)); } genw(0, m/4, 1, w); } void fft(cmplx *A, int k){ const int m = 1 << k; int u = 1; int v = m/4; int i, j; if(k&1){ for(j=0; j>= 1; } for(i=k&~1;i>0;i-=2){ int jh; for(jh=0;jh>= 2; } } void ifft(cmplx *A, int k){ const int m = 1 << k; int u = m/4; int v = 1; int i, j; for(i=2;i<=k;i+=2){ int jh; for(jh=0;jh>= 2; v <<= 2; } if(k&1){ for(j = 0;j=P[i-1];j--){ dpP[i][j] = add(dpP[i-1][j], dpP[i][j-P[i-1]]); } for(;j>=0;j--){ dpP[i][j] = dpP[i-1][j]; } } } for(i=1;i<=S;i++) dpC[i][0] = 1; for(k=0;k=C[i-1];j--){ dpC[i][j] = add(dpC[i-1][j], dpC[i][j-C[i-1]]); } for(;j>=0;j--){ dpC[i][j] = dpC[i-1][j]; } } } PL[0] = 0; for(i=1;i<=P[S-1]*300;i++){ int x = dpP[S][i]; PL[i] = x%B + x/B * I; } QL[0] = 0; for(i=1;i<=C[S-1]*300;i++){ int x = dpC[S][i]; QL[i] = x%B + x/B * I; } init(K, w); fft_real(PL, PH, K-1); fft_real(QL, QH, K-1); for(i=0;i>= 1){ for(i=0;i