読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

Codeforces Round #333 (Div. 2)-A

CodeForces C++ 競技プログラミング

回答

誤差が出てダメな奴(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;
}