1. 程式人生 > 其它 >洛谷P1865 A % B Problem(字首和)

洛谷P1865 A % B Problem(字首和)

原題連結

  • 題目大意:就原題的意思,求某個區間內素數和個數。

  • Tag:

  1. 字首和
  2. 線性篩法
  • 思路:
    求某個區間內的和,第一個想到的是字首和。與此同時,題目要求的是素數的個數,那麼我們可以將線性篩法和字首和同時進行。
    如果當前這個數是素數,那麼我們將從第一個素數到當前這個下標數區間內的素數個數和加一,即
    s[i] = s[i- 1] + 1。
    否則與上一個數保持一致,即
    s[i] = s[i - 1]
  • Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e6 + 10;

int n, m, l, r;

bool isprime[N];
int s[N];//從第一個素數到當前這個下標數的區間內的素數個數和

void fun() {
	memset(isprime, true, sizeof(isprime));
	isprime[1] = false;
	for(int i = 2; i <= m; i++) {
		if(isprime[i]) {
			for(int j = i * 2; j <= m; j += i)
				isprime[j] = false;
			s[i] = s[i - 1] + 1;//個數加一
		}
		else s[i] = s[i - 1];//個數不變
	}
}

int main() {
    scanf("%d%d", &n, &m);
    fun();
    for(int i = 0; i < n; i++) {
    	scanf("%d%d", &l, &r);
    	if(l < 1 || r > m) {//還有邊界的哦
    		printf("Crossing the line\n");
    		continue;
		}
		printf("%d\n", s[r] - s[l - 1]);
	}
    return 0;
}