牛客練習賽129 A-數數

Coder何發表於2024-09-27

複習一下埃氏篩,快速拿出n以內質數。該題要是一個一個去計算“偶數”會超時非常多。

題意中”奇數“的本質是質數及質數的n次冪,所以先求出n以內所有質數及其n次冪的個數,就能計算出“偶數”的個數。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<bool> isPrime(5000005, true);
 4 vector <int> prime;
 5 int solve(int n) {
 6     if (n < 6) {
 7         return 0;
 8     }
 9     int oddCount = 0;
10     for(auto j : prime){
11         if (j > n){
12             break;
13         }
14         for (int i = 1;i < 23; ++i){ //題面資料n最大是5*10^5,在2^22到2^23之間,最大冪取22
15             if (pow(j, i) <= n){
16                 ++oddCount;
17             }else{
18                 break;
19             }
20         }
21     }
22     return n - oddCount - 1; //減去1,因為1非奇非偶
23 }
24 
25 int main() {
26     int n;
27     cin >> n;
28     //埃氏篩篩出質數
29     for (int i = 2; i <= sqrt(n); ++i) {
30         if (isPrime[i]) {
31             for (int j = i * i; j <= n; j += i) {
32                 isPrime[j] = false;
33             }
34         }
35     }
36     for (int i = 2;i <= n;++i){
37         if (isPrime[i])
38         prime.push_back(i);
39     }
40     cout<<solve(n);
41 }

相關文章