Official

C - オーダー/Order Editorial by physics0523


まず、答えは必ず oo...oxx...x という形になります。
理由: \(N^k\) は今回の問題の制約上 (\(1 \le N\)) で \(p<q\) ならば \(N^p \le N^q\) となる。

次に、今回の問題の最大ケースを考察します。
\(N=10^9,M=10^5\) のとき、 \(N^k=(10^9)^{100000}\) と、 \(N^k\) の値が単純に扱うことのできない大きさになってしまいます。なので、単純に \(N^k\) の計算を行うのではなく何らかの工夫が必要となります。

ここで、先ほど述べた答えが oo...oxx...x の形になるという性質が生かされます。
ある時点で \(N^k > 10^9\) となれば、その先は特に計算をしなくとも x をつけてよいです。

なお、 \(N^k\) の値は \(k=1,2,...\)\(k\)\(1\) つ進めるごとに \(N\) 倍することで求めることができます。 また、 \(N^k \le 10^9\) のとき \(N^{(k+1)} \le 10^{18}\) なので、 long long 型のような \(64\)bit 符号付き整数があれば事足ります。(逆に、 unsigned int 型のような \(32\)bit 符号付き整数では(特別な工夫などをしない限り)桁が足りなくなります。)

実装例(C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  long long n,m;
  cin >> n >> m;
  long long val=1;
  for(int i=1;i<=m;i++){
    if(val>1000000000){
      cout << "x";
      continue;
    }
    val*=n;
    if(val>1000000000){cout << "x";}
    else{cout << "o";}
  }
  cout << "\n";
  return 0;
}

posted:
last update: