名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

Codeforces Round #333 (Div. 2)-A

回答

誤差が出てダメな奴(WA)
http://codeforces.com/contest/602/submission/14591541

OKなの
http://codeforces.com/contest/602/submission/14592339

与えられる2つの整数値の大小を判定する問題.
しかし,与えられる数値は指定された進数で,各桁ごとの数値が渡される形式で与えられる.
例えば,

10 16
15 15 4 0 0 0 0 7 10 9

みたいな感じだと,16進数10桁の数値が与えられて,前から10桁目の値,9桁目の値,のように与えられる.

なので,この数値を10進数に直し,比較することを考える.
(ちなみに,40進数の10桁とかくることがあるので,long long型で計算しないとダメです)

n進数の数値を10進数に直すには,例えば

3 16
5 4 2

のとき,5 * 16^2 + 4 * 16^1 + 2 * 16^0 のように計算ができる.
なので,これをfor文を用いて計算する.
しかし,標準のpow関数を用いてしまうと,pow関数の元々の返り値はdouble型であるので,計算結果に誤差が出る場合があり,落ちてしまうことがある.
(それが上記に貼った誤差が出てダメな奴のこと)

そこで解決方法としては,10^-6など小さな数値を足す方法と,整数の場合のpow関数を自作することが考えられる.
特に理由はないですが,試しに実装してみたいという気持ちがあったので,自作のpow関数を私は定義することにしました.
こんな感じ.

ll mypow(ll num, int index) {
    ll ret = 1;
    REP(i, index) ret *= num;
    return ret;
}

指数indexがマイナスの場合とか考慮してないです(小声).

というわけで,自作したpow関数を用いつつ,2つの数値を10進数に変換して,比較すればよいでしょう.
終わり.

ll mypow(ll num, int index) {
    ll ret = 1;
    REP(i, index) ret *= num;
    return ret;
}

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout.precision(16);
  
  ll nums[2] = {0, 0};
  REP(i, 2) {
    int inp, decimal;
    cin >> inp >> decimal;
    
    int array[inp];
    REP(j, inp) cin >> array[j];
    
    RREP(j, inp) {
        nums[i] += array[j] * mypow(decimal, inp-j-1);
    }
  }
  
  if(nums[0] == nums[1]) {
    cout << "=" << endl;
  } else if(nums[0] < nums[1]) {
    cout << "<" << endl;
  } else {
    cout << ">" << endl;
  }
  return 0;
}