#include using namespace std; using cd = complex; const double PI = acos(-1); int reverse(int num, int lg_n) { int res = 0; for (int i = 0; i < lg_n; i++) { if (num & (1 << i)) res |= 1 << (lg_n - 1 - i); } return res; } void fft(vector & a, bool invert) { int n = a.size(); int lg_n = 0; while ((1 << lg_n) < n) lg_n++; for (int i = 0; i < n; i++) { if (i < reverse(i, lg_n)) swap(a[i], a[reverse(i, lg_n)]); } for (int len = 2; len <= n; len <<= 1) { double ang = 2 * PI / len * (invert ? -1 : 1); cd wlen(cos(ang), sin(ang)); for (int i = 0; i < n; i += len) { cd w(1); for (int j = 0; j < len / 2; j++) { cd u = a[i+j], v = a[i+j+len/2] * w; a[i+j] = u + v; a[i+j+len/2] = u - v; w *= wlen; } } } if (invert) { for (cd & x : a) x /= n; } } vector multiply(vector const& a, vector const& b) { vector fa(a.begin(), a.end()), fb(b.begin(), b.end()); int n = 1; while (n < a.size() + b.size()) n <<= 1; fa.resize(n); fb.resize(n); fft(fa, false); fft(fb, false); for (int i = 0; i < n; i++) fa[i] *= fb[i]; fft(fa, true); vector result(n); for (int i = 0; i < n; i++) { result[i] = round(fa[i].real()); if(result[i]!=0)result[i]=1; } return result; } vectorpres; int n,d; bool check(int ind) { vectornewn; for(int i=0; i >a; for(int x:newn) { if(x==0) { a.push_back({1}); continue; } vectorb; b.push_back(1); for(int i=1; i1) { vector >b; for(int i=1; i0 && b.back().back()==0)b.back().pop_back(); } //if(a.size()%2)b.push_back(a.back()); a=b; } for(int i=d-pres[ind]; i>n>>d; for(int i=0; i>x; pres.push_back(x); } sort(pres.begin(),pres.end()); int l=0,r=pres.size(); while(l+1