Polynomial<Type> operator*(const Polynomial<Type> &x, const Polynomial<Type> &y) { Polynomial<Type> result; result.resize(x.size() + y.size() - 1); for(size_t f = 0; f < x.size(); ++ f) for(size_t s = 0; s < y.size(); ++ s) result[f + s] = result[f + s] + x[f] * y[s]; return result; }
int main() { #ifndef __WATASHI__ freopen("stable.in", "r", stdin); freopen("stable.out", "w", stdout); #endif scanf("%d", &Polynomial::r); Polynomial p = readPolynomial(); Polynomial q = readPolynomial(); vector<vector<int> > v(2, vector<int>(Polynomial::r)); for (int i = 0; i < Polynomial::r; ++i) { v[0][i] = p(i); v[1][i] = q(i); } gao(v[0]); gao(v[1]); BigInteger ans(1); vector<int> w(Polynomial::r, 0); for (int i = 0; i < Polynomial::r; ++i) { if (v[0][i] == -1 || v[1][i] == -1) { w[i] = -1; } } for (int i = 0; i < Polynomial::r; ++i) { if (w[i] != 0) { continue; } vector<int> q(1, i); for (int j = 0; j < (int)q.size(); ++j) { switch (w[v[0][q[j]]]) { case -1: goto NEXT; case 0: q.push_back(v[0][q[j]]); default: w[v[0][q[j]]] |= 1; } switch (w[v[1][q[j]]]) { case -1: goto NEXT; case 0: q.push_back(v[1][q[j]]); default: w[v[1][q[j]]] |= 2; } } ans *= 2; NEXT: for (int j = 0; j < (int)q.size(); ++j) { w[q[j]] = -1; } } writeBigInteger(ans); return 0; }
SynapsTraits<QQ>::SolverPolynomial SynapsTraits<QQ>:: convert(const Polynomial& p) { SolverPolynomial result(1, p.size() - 1); assert(result.size() == p.size()); ZZ denominator_product = 1; for (unsigned int i = 0; i < p.size(); ++i) denominator_product *= SYNAPS::denominator(p[i]); for (unsigned int i = 0; i < p.size(); ++i) result[i] = SYNAPS::numerator(p[i]) * denominator_product / SYNAPS::denominator(p[i]); return result; }