D124.PrimeArrangements题目链接1175.PrimeArrangements题目分析这道题,给一个数n,生成一个从1到n的数组,有多少种拼法带质数的数就是质数?其中,1<=n<=100由于最终返回值可能比较大,请返回mod(10**9+7)后的结果。思路是质数位置的数可以任意排列,剩下的非质数位置也可以任意排列,所以我们分别计算这两种情况,然后相乘。由于n的取值范围最大为100,可以手写素数,可以用空间换取时间。其次,我们需要知道在给定数n之前有多少个质数。这个比较简单,就是用array_flip函数把我们前面生成的素数数组的key和value进行反转即可。一旦获得,就可以使用阶乘计算排列数。对于非素数,我们使用range函数生成1到100之间的值,然后使用array_diff函数生成一个非素数数组。值减去键就是非素数的个数。因此,我们先用is_set来判断给定的n是在素数数组还是非素数数组中。在质数数组中,直接以n为键,去数组中取值即可。在非素数数组中,以n为key,从非素数数组中取值+1,可以得到n和之前有多少个非素数。为什么+1是因为array_diff返回下标从0开始。N减去非素数的个数等于素数的个数。好吧,现在我们有了质数和非质数,需要做的就是阶乘。我们都知道阶乘后的值上升很快,所以每次乘一个数我都用一个模数。先用range函数生成需要参与阶乘的数,然后用array_values获取这些数,最后用array_reduce将一维数组转为数。这里素数和非素数是一样的,就不多解释了。需要注意的是,返回的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);如果(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;返回$carry%(pow(10,9)+7);},1);$nonPrimePermutation=max(1,$nonPrimePermutation);返回($primesPermutation*$nonPrimePermutation)%(pow(10,9)+7);}}如果您觉得本文对您有用,欢迎使用爱根贷来资助
