예제 #1
0
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;
}
예제 #2
0
파일: I.cpp 프로젝트: Crmiv/AlgoSolution
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;
}
예제 #3
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;
}