複習一下埃氏篩,快速拿出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 }