970-強整数


前言
Weekly Contest 118の強い整数:
2つの非負の整数xおよびyが与えられ、ある整数がx^i+y^jに等しく、整数i >= 0およびj >= 0である場合、整数は強い整数であると考えられる.bound以下の値を持つすべての強い整数のリストを返します.
任意の順序で答えを返すことができます.あなたの回答では、値ごとに最大1回表示されます.
例1:
  :x = 2, y = 3, bound = 10
  :[2,3,4,5,7,9,10]
  : 
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2

例2:
  :x = 3, y = 5, bound = 15
  :[2,4,6,8,10,14]

ヒント:
  • 1 <= x <= 100
  • 1 <= y <= 100
  • 0 <= bound <= 10^6

  • 問題を解く構想.
    本題は正の整数の中でx^i+y^jかつ<=boundを満たす数を見つければよいので,二重forサイクルで条件を満たす数を見つければよい.
    注意事項:
  • サイクル中に重複する値が発生し、例えば
      :x = 2, y = 3, bound = 10
      :[2,3,4,5,7,9,10]
      : 
    2 = 2^0 + 3^0
    3 = 2^1 + 3^0
    4 = 2^0 + 3^1
    5 = 2^1 + 3^1
    5 = 2^2 + 3^0
    7 = 2^2 + 3^1
    9 = 2^3 + 3^0
    10 = 2^0 + 3^2
    サイクル中に重複する場合が
    5 = 2^1 + 3^1
    5 = 2^2 + 3^0
    である場合、先にSetを使用して結果の重さを除去することができる
  • .
  • がタイムアウトを実行する場合、例えば :x = 1, y = 3, bound = 100.したがって、boundではなく、x^bound>bound(Integer.MAX_VALUEが一定である)のサイクル数を選択することができる.

  • インプリメンテーションコード
        /**
         * 970.    
         * @param x
         * @param y
         * @param bound
         * @return
         */
        public List powerfulIntegers(int x, int y, int bound) {
            //    Set            
            Set set = new HashSet<>();
            //     bound,   Integer.MAX_VALUE,      
            for (int i = 0; i < bound; i++) {
                int tmp1 = (int) Math.pow(x, i);
                //         bound,      ,      
                if (tmp1 > bound) {
                    break;
                }
                //     bound,   Integer.MAX_VALUE,      
                for (int j = 0; j < bound; j++) {
                    int tmp2 = (int) (Math.pow(y, j));
                    int tmp = tmp1 + tmp2;
                    //      bound
                    if (tmp <= bound) {
                        set.add(tmp);
                    } else {//  bound      ,           bound
                        break;
                    }
                }
            }