快速幂,素数筛

  • 快速幂
    情景:计算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;
}
posted @ 2025-04-01 23:42  m1kasaz  阅读(14)  评论(0)    收藏  举报