Problem6567--学习系列 —— 欧拉筛

6567: 学习系列 —— 欧拉筛

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 256 MiB

Description

【知识点】

欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。
欧拉筛法是比埃氏筛法更高效的一种素数筛法,确保每个合数只被筛掉一次,算法复杂度达到 $O(n)$,被称为线性筛。

【时间复杂度】

$O(n)$

【代码】

void euler(LL n) {
	for (LL i=2;i<=n;i++) {
		//cout<<" i = "<<i<<"\n";
		if (false==st[i]) {
			primes[++cnt]=i;
		}
		//遍历所有素数,将素数的倍数删除 
		for (LL j=1;primes[j]<=n/i;j++) {
			//cout<<"  j = "<<j<<" primes["<<j<<"]"<<" = "<<primes[j]<<" i*primes[j] = "<<i*primes[j]<<"\n";
			st[primes[j]*i]=true;
			if (i%primes[j]==0) {
				break;
			}
		}
	}
}

例如,当 n=100 时候,1 ~ 100 内有 25 个质数,也就是 cnt=25。对应的输出如下:
 i = 2
  j = 1 primes[1] = 2 i*primes[j] = 4
 i = 3
  j = 1 primes[1] = 2 i*primes[j] = 6
  j = 2 primes[2] = 3 i*primes[j] = 9
 i = 4
  j = 1 primes[1] = 2 i*primes[j] = 8
 i = 5
  j = 1 primes[1] = 2 i*primes[j] = 10
  j = 2 primes[2] = 3 i*primes[j] = 15
  j = 3 primes[3] = 5 i*primes[j] = 25
 i = 6
  j = 1 primes[1] = 2 i*primes[j] = 12
 i = 7
  j = 1 primes[1] = 2 i*primes[j] = 14
  j = 2 primes[2] = 3 i*primes[j] = 21
  j = 3 primes[3] = 5 i*primes[j] = 35
  j = 4 primes[4] = 7 i*primes[j] = 49
 i = 8
  j = 1 primes[1] = 2 i*primes[j] = 16
 i = 9
  j = 1 primes[1] = 2 i*primes[j] = 18
  j = 2 primes[2] = 3 i*primes[j] = 27
 i = 10
  j = 1 primes[1] = 2 i*primes[j] = 20
 i = 11
  j = 1 primes[1] = 2 i*primes[j] = 22
  j = 2 primes[2] = 3 i*primes[j] = 33
  j = 3 primes[3] = 5 i*primes[j] = 55
  j = 4 primes[4] = 7 i*primes[j] = 77
 i = 12
  j = 1 primes[1] = 2 i*primes[j] = 24
 i = 13
  j = 1 primes[1] = 2 i*primes[j] = 26
  j = 2 primes[2] = 3 i*primes[j] = 39
  j = 3 primes[3] = 5 i*primes[j] = 65
  j = 4 primes[4] = 7 i*primes[j] = 91
 i = 14
  j = 1 primes[1] = 2 i*primes[j] = 28
 i = 15
  j = 1 primes[1] = 2 i*primes[j] = 30
  j = 2 primes[2] = 3 i*primes[j] = 45
 i = 16
  j = 1 primes[1] = 2 i*primes[j] = 32
 i = 17
  j = 1 primes[1] = 2 i*primes[j] = 34
  j = 2 primes[2] = 3 i*primes[j] = 51
  j = 3 primes[3] = 5 i*primes[j] = 85
 i = 18
  j = 1 primes[1] = 2 i*primes[j] = 36
 i = 19
  j = 1 primes[1] = 2 i*primes[j] = 38
  j = 2 primes[2] = 3 i*primes[j] = 57
  j = 3 primes[3] = 5 i*primes[j] = 95
 i = 20
  j = 1 primes[1] = 2 i*primes[j] = 40
 i = 21
  j = 1 primes[1] = 2 i*primes[j] = 42
  j = 2 primes[2] = 3 i*primes[j] = 63
 i = 22
  j = 1 primes[1] = 2 i*primes[j] = 44
 i = 23
  j = 1 primes[1] = 2 i*primes[j] = 46
  j = 2 primes[2] = 3 i*primes[j] = 69
 i = 24
  j = 1 primes[1] = 2 i*primes[j] = 48
 i = 25
  j = 1 primes[1] = 2 i*primes[j] = 50
  j = 2 primes[2] = 3 i*primes[j] = 75
 i = 26
  j = 1 primes[1] = 2 i*primes[j] = 52
 i = 27
  j = 1 primes[1] = 2 i*primes[j] = 54
  j = 2 primes[2] = 3 i*primes[j] = 81
 i = 28
  j = 1 primes[1] = 2 i*primes[j] = 56
 i = 29
  j = 1 primes[1] = 2 i*primes[j] = 58
  j = 2 primes[2] = 3 i*primes[j] = 87
 i = 30
  j = 1 primes[1] = 2 i*primes[j] = 60
 i = 31
  j = 1 primes[1] = 2 i*primes[j] = 62
  j = 2 primes[2] = 3 i*primes[j] = 93
 i = 32
  j = 1 primes[1] = 2 i*primes[j] = 64
 i = 33
  j = 1 primes[1] = 2 i*primes[j] = 66
  j = 2 primes[2] = 3 i*primes[j] = 99
 i = 34
  j = 1 primes[1] = 2 i*primes[j] = 68
 i = 35
  j = 1 primes[1] = 2 i*primes[j] = 70
 i = 36
  j = 1 primes[1] = 2 i*primes[j] = 72
 i = 37
  j = 1 primes[1] = 2 i*primes[j] = 74
 i = 38
  j = 1 primes[1] = 2 i*primes[j] = 76
 i = 39
  j = 1 primes[1] = 2 i*primes[j] = 78
 i = 40
  j = 1 primes[1] = 2 i*primes[j] = 80
 i = 41
  j = 1 primes[1] = 2 i*primes[j] = 82
 i = 42
  j = 1 primes[1] = 2 i*primes[j] = 84
 i = 43
  j = 1 primes[1] = 2 i*primes[j] = 86
 i = 44
  j = 1 primes[1] = 2 i*primes[j] = 88
 i = 45
  j = 1 primes[1] = 2 i*primes[j] = 90
 i = 46
  j = 1 primes[1] = 2 i*primes[j] = 92
 i = 47
  j = 1 primes[1] = 2 i*primes[j] = 94
 i = 48
  j = 1 primes[1] = 2 i*primes[j] = 96
 i = 49
  j = 1 primes[1] = 2 i*primes[j] = 98
 i = 50
  j = 1 primes[1] = 2 i*primes[j] = 100
 i = 51
 i = 52
 i = 53
 i = 54
 i = 55
 i = 56
 i = 57
 i = 58
 i = 59
 i = 60
 i = 61
 i = 62
 i = 63
 i = 64
 i = 65
 i = 66
 i = 67
 i = 68
 i = 69
 i = 70
 i = 71
 i = 72
 i = 73
 i = 74
 i = 75
 i = 76
 i = 77
 i = 78
 i = 79
 i = 80
 i = 81
 i = 82
 i = 83
 i = 84
 i = 85
 i = 86
 i = 87
 i = 88
 i = 89
 i = 90
 i = 91
 i = 92
 i = 93
 i = 94
 i = 95
 i = 96
 i = 97
 i = 98
 i = 99
 i = 100
cnt=25
idx:  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25
      2   3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83  89  97

Source/Category