yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 245 D - Polynomial division

問題の要約
 N次多項式A(x)とM次多項式B(x)がある。
 それらの積をC(x)=A(x)B(x)とする。
 A0,...,ANおよびC0,...,CN+Mが与えられるので、B0,...,BMを求めよ。
 ただし、与えられる入力に対して、条件を満たすB0,...,BMがただ一つ存在することが保証される。
制約
 1<=N,M<100
 |Ai|<=100
 |Ci|<=10^6
 AN,CM+M≠0
入力
 N M
 A0 ... AN
 C0 ... CN+M
出力
 M+1個のB0,...,BMを空白区切りで一行で出力せよ。
考え方
 1,多項式の割り算を実装するだけでよい。

実際のプログラム
#include<iostream>
#include<vector>

using namespace std;

int main(){
  int N,M;
  cin >> N >> M;
  
  vector<int> A(N+1);
  for(int i = 0; i < N+1; i++){
    cin >> A[i];
  }
  
  vector<int> C(N+M+1);
  for(int i = 0; i < N+M+1; i++){
    cin >> C[i];
  }
  
  vector<int> B(M+1,0);
  int j = N;
  for(int i = M; i >= 0; i--){
    j = N;
    B[i] = C[i+j] / A[j];
    for(; j >= 0; j--){
      C[i+j] = C[i+j] - B[i]*A[j];  
    }
  }
  
  for(int i = 0; i < M+1; i++){
    cout << B[i] << " ";
  }cout << endl;
  
  return 0;
}