Leetcode PHP問題解--D 124 1175.Prime Arrangements

2606 ワード

D124 1175. Prime Arrangements
タイトルリンク
1175. Prime Arrangements
テーマ分析
この問題は、1つの数字nをあげて、1からnまでの配列を生成して、どれだけの配列の方式が質数の位の数字を質数にしますか?そのうち1<=n<=100
最終的な戻り値が大きい場合がありますので、mod(10**9+7)後の結果を返してください.
構想
すなわち,質数位の数字は任意に配列できるが,残りの非質数位も任意に配列できるので,二つのケースを別々に計算し,乗算すればよい.
nの範囲は100であるため,質量数を手書きで書き,空間で時間を変えることができる.
次に,与えられた数字nと以前にどれだけの質量数があったかを知る必要がある.これは比較的簡単で,我々が前に生成した素数配列の鍵と値をarray_flip関数で逆さまにするだけでよい.得られたら,階乗を用いて配列数を算出することができる.
非質量数の場合,range関数を用いて1〜100の値を生成し,次いでarray_diff関数を用いて非質量数配列を生成した.値減算キーは非質量数の個数です.
そこで,is_setを用いて,与えられたnが素数配列にあるか非素数配列にあるかを判断した.素数配列では,nを直接キーとし,配列から値を取得すればよい.非素数配列では,非素数配列からnをキーとして+1を取得すると,nとそれ以前にどれだけの非素数が得られるかが得られる.なぜ+1なのかはarray_diffが返すのは下付き文字が0からです.n非素数の数を減算すると素数の数に等しい.
はい、今は質量数と非質量数があります.必要なのは階乗です.階乗後の値の上昇が非常に速いことはよく知られているので、数字を1つ乗るたびに型を取ります.
まずrange関数で乗算に参加する必要がある数値を生成し、array_valuesはこれらの数字を取得し、最後にarray_を使用します.reduceは1次元配列を1つの数にします.ここで素数は非素数と同じで、あまり説明しません.
なお,nの戻りには1が含まれており,すなわち素数が0の場合がある.ここでarray_reduceなら0を返します.さらに乗算すると0に戻ります.そこで計算後max関数で最小値を1に設定しました.
最終コード
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97];
        $nonPrimes = array_values(array_diff(range(1,100), $primes));
        $primesBeforeIndex = array_flip($primes);
        $nonPrimesBeforeIndex = array_flip($nonPrimes);
        if(isset($primesBeforeIndex[$n])){
            $primeAmount = $primesBeforeIndex[$n];
            $nonePrimeAmount = $n - $primeAmount;
        }
        else{
            $nonePrimeAmount = $nonPrimesBeforeIndex[$n]+1;
            $primeAmount = $n - $nonePrimeAmount;
        }
        $primesPermutation = array_reduce(array_values(range(1,$primeAmount)), function($carry, $item){
            $carry *= $item;
            return $carry%(pow(10,9)+7);
        },1);
        $primesPermutation = max(1, $primesPermutation);
        $nonPrimePermutation = array_reduce(array_values(range(1,$nonePrimeAmount)), function($carry, $item){
            $carry *= $item;
            return $carry%(pow(10,9)+7);
        },1);
        $nonPrimePermutation = max(1, $nonPrimePermutation);
        return ($primesPermutation * $nonPrimePermutation)%(pow(10,9)+7);
    }
}

この文章があなたに役に立つと思ったら、よくはつでんするで援助してください.