题目
挺简单的一道题,被卡住半天,要记得用long。。。。
class Solution {
public int numPrimeArrangements(int n) {
int mod = (int)Math.pow(10,9)+7;
int res = 0;
for(int i=1;i<=n;i++){
if(isPrime(i)) res++;
}
long sum = 1;
for(int i=2;i<=res;i++){
sum = sum*i;
sum = sum%mod;
}
for(int j=2;j<=n-res;j++){
sum = sum*j;
sum = sum%mod;
}
return (int)sum;
}
public boolean isPrime(int n){
if(n==1) return false;
if(n==2) return true;
int r=(int)Math.sqrt(n)+1;
for(int i=2;i<=r;i++){
if(n%i==0) return false;
}
return true;
}
}
哔哩哔哩上看到米开的这道题用的BigInteger
import java.math.BigInteger;
class Solution {
public int numPrimeArrangements(int n) {
int mod = 1000000007;
boolean[] check = new boolean[n+1];
Arrays.fill(check,2,n+1,true);
int primenum = 0;
for(int i=1;i*i<=n;i++){
if(check[i]){
for(int j=i*i;j<=n;j+=i){
check[j] = false;
}
}
}
for(int i=1;i<=n;i++){
if(check[i]) primenum++;
}
BigInteger a = get(primenum);
BigInteger b = get(n-primenum);
return a.multiply(b).mod(BigInteger.valueOf(mod)).intValue();
}
public BigInteger get(int n){
BigInteger c = BigInteger.ONE;
for(int i=2;i<=n;i++){
c = c.multiply(BigInteger.valueOf(i));
}
return c;
}
}
学一学大佬的写法,速度慢很多。