Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2013
883
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include<iostream>
  2. #include<cmath>
  3. #include<memory.h>
  4.  
  5. const int threads_num=4;
  6. const int SQRT_MAXN = 33000;
  7. const int S = 100000; //размер блока
  8. bool nprime[SQRT_MAXN], bl[threads_num][S];
  9. int primes[SQRT_MAXN], cnt;
  10. long long ans[threads_num];
  11.  
  12. long long pre[]={0, 1906816620981654LL, 7357074544482779LL, 16217881619242062LL, 28422918403819825LL};
  13.  
  14. int n;
  15. int startBlock, endBlock;
  16. int nstart, nend;
  17.  
  18. void* exec(void *tid)
  19. {
  20.     long id=(long)tid;
  21.    
  22.     int bcnt=(endBlock-startBlock+1)/threads_num; // количество блоков на поток
  23.     int bend=(id==threads_num-1)? (endBlock+1) : (id+1)*bcnt+startBlock; //последний обрабатывает остаток
  24.    
  25.    
  26.     for (int k=id*bcnt+startBlock; k<bend; ++k)
  27.     {
  28.         memset (bl[id], 0, sizeof(bool)*S);
  29.        
  30.         int tstart = k * S; //число с которого начинается блок
  31.         for (int i=0; i<cnt; ++i)
  32.         {
  33.             int start_idx = (tstart + primes[i] - 1) / primes[i], j;
  34.             j = start_idx>1 ? start_idx : 2;           
  35.             j = j * primes[i] - tstart;
  36.            
  37.             for (; j<S; j+=primes[i])
  38.                 bl[id][j] = true;
  39.         }
  40.        
  41.         if (k == 0)
  42.             bl[id][0] = bl[id][1] = true;
  43.            
  44.         for (int i=std::max(0, nstart-tstart); i<S && tstart+i<=nend; ++i)
  45.             if (!bl[id][i])
  46.                 ans[id]+=tstart+i;
  47.     }
  48.    
  49.     return NULL;
  50. }
  51.  
  52. long long calc(int start, int end)
  53. {
  54.     long long res=0;
  55.     startBlock = start/S;
  56.     endBlock=end/S;
  57.     nstart=start; nend=end;
  58.    
  59.     int nsqrt = (int) sqrt (end + .0);
  60.     primes[cnt++]=2;
  61.     for (int i=3; i<=nsqrt; i+=2)
  62.         if (!nprime[i]) {
  63.             primes[cnt++] = i;
  64.             for (int j=i*i; j<=nsqrt; j+=i)
  65.                 nprime[j] = true;
  66.         }
  67.  
  68.     pthread_t threads[threads_num];
  69.     for(int i=0; i<threads_num; ++i)
  70.         pthread_create(threads + i, NULL, exec, (void*)(i));
  71.    
  72.     for(int i = 0; i < threads_num; i++)
  73.         pthread_join(threads[i], NULL);
  74.  
  75.     for(int i=0; i<threads_num; ++i)
  76.         res+=ans[i];
  77.    
  78.    
  79.     return res;
  80. }
  81.  
  82. int main() {
  83.     long long res=0;
  84.     int n;
  85.     std::cin >> n;
  86.    
  87.     int i=(n-1)/(1<<28);
  88.     int start=i*(1<<28)+1;
  89.     int end=(i+1)*(1<<28);
  90.    
  91.     if(n-start < end-n)
  92.         res=pre[i] + calc(start+1, n);
  93.     else
  94.         res=pre[i+1]-calc(n+1, end);
  95.    
  96.     std::cout << res;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement