快速幂,素数筛
- 快速幂
情景:计算a^n%m时,n十分大
原理:幂次用2的次方分解,如11=8+2+1=23+21+2*0,如何知道这些组成呢?这里用到二进制的特性,若该位置对应的二进制码为1,则乘,为0,则不乘
eg:11=1101B
long fastPow(int a,int n,int m) {
long ans = 1;
a = a%m;
while(n>0) {
if((n&1)==1) ans = ans*a%m;
a = a*a%m;
n>>=1;
}
return ans;
}
*素数筛
情景:求2~n间的所有素数,n十分大
原理:若一个数是素数,则他的倍数非素数,计算出所有非素数,用总数减去非素数即为素数数量
所以在2到\(\sqrt{n}\)间找出所有素数,再在2到n间消除非素数
long sumPrime(int n){
int[] isPrime = new int[n+1];
boolean[] vis = new boolean[n+1];
int k = 0;
for (int i = 2; i <= Math.sqrt(n); i++) {
if(!vis[i]) isPrime[k++] = i;
for (int j = 2*i; j <= n; j+=i) {
vis[j] = true;
}
}
return k;
}