結果

問題 No.40 多項式の割り算
ユーザー beetbeet
提出日時 2018-11-12 17:54:57
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 4 ms / 5,000 ms
コード長 2,873 bytes
コンパイル時間 2,064 ms
コンパイル使用メモリ 206,040 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-08-25 02:48:54
合計ジャッジ時間 3,766 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 2 ms
4,380 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 2 ms
4,380 KB
testcase_04 AC 3 ms
4,376 KB
testcase_05 AC 3 ms
4,380 KB
testcase_06 AC 4 ms
4,376 KB
testcase_07 AC 4 ms
4,380 KB
testcase_08 AC 2 ms
4,380 KB
testcase_09 AC 3 ms
4,380 KB
testcase_10 AC 3 ms
4,380 KB
testcase_11 AC 3 ms
4,380 KB
testcase_12 AC 2 ms
4,380 KB
testcase_13 AC 3 ms
4,376 KB
testcase_14 AC 3 ms
4,376 KB
testcase_15 AC 3 ms
4,380 KB
testcase_16 AC 4 ms
4,376 KB
testcase_17 AC 2 ms
4,380 KB
testcase_18 AC 4 ms
4,376 KB
testcase_19 AC 3 ms
4,376 KB
testcase_20 AC 3 ms
4,376 KB
testcase_21 AC 2 ms
4,376 KB
testcase_22 AC 2 ms
4,376 KB
testcase_23 AC 2 ms
4,376 KB
testcase_24 AC 3 ms
4,380 KB
testcase_25 AC 1 ms
4,376 KB
testcase_26 AC 2 ms
4,376 KB
testcase_27 AC 1 ms
4,380 KB
testcase_28 AC 1 ms
4,380 KB
testcase_29 AC 1 ms
4,376 KB
testcase_30 AC 1 ms
4,376 KB
testcase_31 AC 1 ms
4,380 KB
testcase_32 AC 1 ms
4,380 KB
testcase_33 AC 2 ms
4,380 KB
testcase_34 AC 1 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}


struct Polynomial{
  using P = Polynomial;
  vector<Int> co;
  Polynomial():co(1,1){}
  Polynomial(Int s):co(s,0){}
  Polynomial(vector<Int> co):co(co){}
  
  size_t size() const{
    return co.size();
  };

  void shrink(){
    while(co.size()>1u&&!co.back())
      co.pop_back();
  }

  void reduce(){
    Int g=abs(co.back());
    if(!g) return;
    for(Int c:co)
      if(c!=0) g=__gcd(g,abs(c));
    if(co.back()<0) g*=-1;
    for(Int &c:co) c/=g;
  }

  void print(){
    shrink();
    reduce();
    Int n=size(),flg=0;
    for(Int i=n-1;i>0;i--){
      if(!co[i]) continue;
      flg=1;
      if(i!=n-1&&co[i]>0) cout<<"+";
      if(co[i]==-1) cout<<"-";
      else if(co[i]!=1) cout<<co[i];
      
      cout<<"x";
      if(i!=1) cout<<"^"<<i;
    }
    if(co[0]){
      if(flg&&co[0]>0) cout<<"+";
      cout<<co[0];
    }
    cout<<endl;
  }

  Int operator[](Int i) const{
    return co[i];
  }

  Int &operator[](Int i){
    return co[i];
  }

  P operator-() const{
    P res=*this;
    for(Int &c:res.co) c*=-1;
    return res;
  }

  P operator+(const P &a) const{
    Int n=size(),m=a.size();
    P res(max(n,m));
    for(Int i=0;i<n;i++) res[i]+=co[i];
    for(Int i=0;i<m;i++) res[i]+=a[i];
    return res;
  }
  P operator-(const P &a) const{return *this+(-a);};

  P operator*(const P &a) const{
    Int n=size(),m=a.size();
    P res(n+m);
    for(Int i=0;i<n;i++)
      for(Int j=0;j<m;j++)
        res[i+j]+=co[i]*a[j];
    res.shrink();
    return res;
  }

  P pow(const P &a,Int k) const{
    P res;
    for(Int i=0;i<k;i++) res=res*a;
    return res;
  }
  
  pair<P, P> divide(const P &a) const{
    Int n=size(),m=a.size(),s=n-m+1;
    if(s<0) return make_pair(P(1),*this);
    P div(s);
    P rest=*this;
    for(Int i=0;i<s;i++){
      if(rest[n-(i+1)]%a[m-1]!=0)
        for(Int &c:rest.co) c*=a[m-1];
      Int d=rest[n-(i+1)]/a[m-1];
      div[s-(i+1)]=d;
      for(Int j=m;j>0;j--) rest[n-(i+j)]-=a[m-j]*d;
    }
    return make_pair(div,rest);
  }
  
  P operator/(const P &a) const{return divide(a).first;};
  P operator%(const P &a) const{return divide(a).second;};  
};

Polynomial gcd(Polynomial a,Polynomial b){
  a.shrink();a.reduce();
  b.shrink();b.reduce();
  if(a.size()<b.size()) swap(a,b);
  if(b.size()==1u&&!b[0]) return a;
  return gcd(b,a%b);
}


//INSERT ABOVE HERE
signed main(){
  Int d;
  cin>>d;
  vector<Int> a(d+1);
  for(Int i=0;i<=d;i++) cin>>a[i];
  vector<Int> b({0,-1,0,1});
  Polynomial x(a),y(b);
  Polynomial z=x%y;
  z.shrink();
  auto co=z.co;
  cout<<co.size()-1<<endl;
  for(Int i=0;i<(Int)co.size();i++){
    if(i) cout<<" ";
    cout<<co[i];
  }
  cout<<endl;
  return 0;
}
0