素数筛 + 前缀和 模板

素数筛 + 前缀和 模板

 1 #include <bits/stdc++.h>
 2 #define ll long long int
 3 #define N 20000002
 4 using namespace std;
 5 int sum[N];
 6 bool a[N];
 7 int b[N];
 8 int cnt = 0;
 9 int t,n;
10 
11 int main()
12 {
13     a[0] = true;
14     for(int i=2; i*i<N; i++)
15     {
16         ll k = i*i;
17         for(int j = k; j<N; j+=k)
18         {
19             a[j] = true;
20         }
21     }
22     for(int i=1; i<N; i++)
23     {
24         if(!a[i])
25         {
26             sum[i] = sum[i-1]+1;
27             b[cnt++] = i;
28         }
29         else
30             sum[i] = sum[i-1];
31     }
32     cin>>t;
33     while(t--)
34     {
35 
36         cin>>n;
37         ll ans = 0;
38         for(int i=0; i<cnt&&b[i]<=n; i++)
39         {
40             int pos = n/b[i];
41             ans += sum[pos];
42         }
43         cout<<ans<<endl;
44     }
45     return 0;
46 }

 

posted @ 2018-09-04 14:16  白雪儿  Views(417)  Comments(0Edit  收藏  举报