- 快速幂
情景:计算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;
}