#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //#pragma comment(linker,"/STACK:102400000,102400000") const int MAXN = 20; const int Mod = 104857601; class FFT_GF { public: static const int alpha=79427530; int Alpha[MAXN],Beta[MAXN]; FFT_GF() { for (int i=MAXN-1,a=alpha;i>=0;i--){ Alpha[i]=a;Beta[i]=Pow(a,Mod-2);a=Mul(a,a); } } int Mul(int a,int b){return (((long long)a)*b)%Mod;} int Add(int a,int b){long long c=(long long)a+b;if (c>=Mod) return c-Mod;return c;} int Sub(int a,int b){long long c=(long long)a-b;if (c<0)return c+Mod; return c;} int Pow(int a,int n){if (n==0)return 1;int r=Pow(a,n>>1);r=Mul(r,r);if (n&1)r=Mul(r,a);return r;} void FFT(int *A,int n){ for (int i=0,j=0;i<(1<>=1;} j^=high; } for (int level=0;level>=1;} j^=high; } for (int level=0;level>=1; else rep=(rep+Mod)>>1; } } void convolution(int* A, int *B, int *C, int n) // C <- A * B (|C| = 2**n) it will destory A and B! { //cout << "FFT " << n << endl; FFT(A, n); FFT(B, n); for(int i=0;i<(1<= 8) { for(int i = 0; i < (1<<(N+1)); i++) { A[i] = 0; B[i] = 0; } for(int i = 0; i < (1<= (1<= 2; pos --) { for(int i = 0; i < (1<<(N+1)); i++) { A[i] = 0; B[i] = 0; } for(int i = 0; i < (1<> n >> k; while((1<> a[i]; for(int i = 1; i <= n; i++) cin >> c[i]; memset(moveLeft, 0, sizeof(moveLeft)); for(int i = 1; i <= n; i++) moveLeft[0][(1< 0) { for(int i = 0; i < (1<<(N+2)); i++) { A[i] = 0; B[i] = 0; } for(int i = 0; i < (1<<(N+1)); i++) { A[i] = x_power[i]; B[i] = x_ans[i]; } FFT_GF_solver.convolution(A, B, C, N+2); for(int i = 0; i < (1<<(N+2)); i++) resultArray[i] = C[i]; reduceResultArray2NtoN(N); for(int i = 0; i < (1<<(N+1)); i++) x_ans[i] = resultArray[i]; } for(int i = 0; i < (1<<(N+2)); i++) { A[i] = 0; B[i] = 0; } for(int i = 0; i < (1<<(N+1)); i++) { A[i] = x_power[i]; B[i] = x_power[i]; } FFT_GF_solver.convolution(A, B, C, N+2); for(int i = 0; i < (1<<(N+2)); i++) resultArray[i] = C[i]; reduceResultArray2NtoN(N); for(int i = 0; i < (1<<(N+1)); i++) x_power[i] = resultArray[i]; } for(int i = 0; i < (1<<(N+1)); i++) resultArray[i] = x_ans[i]; reduceResultArray(N); for(int i = 0; i < (1<<(N+1)); i++) x_ans[i] = resultArray[i]; long long ans = 0; for(int i = 1; i <= n; i++) ans = (ans + (long long) a[i] * x_ans[i + (1<