Advertisement
Pabon_SEC

N + NOD (N)

May 17th, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAX 1000005
  3.  
  4. using namespace std;
  5.  
  6. vector<int>prime;
  7.  
  8. vector<int>sequence;
  9.  
  10. int NOD[MAX],vis[MAX];
  11.  
  12. bool check[MAX];
  13.  
  14. void sieve()
  15. {
  16.     int i,j,k;
  17.  
  18.     k = sqrt(MAX);
  19.  
  20.     prime.push_back(2);
  21.  
  22.     for(i=3; i<=k; i+=2)
  23.     {
  24.         if(check[i]==0)
  25.         {
  26.             for(j=i*i; j<MAX; j+=i+i)
  27.             {
  28.                 check[j]=1;
  29.             }
  30.         }
  31.     }
  32.  
  33.     for(i=3;i<MAX;i+=2)
  34.     {
  35.         if(check[i]==false)
  36.         {
  37.             prime.push_back(i);
  38.         }
  39.     }
  40.  
  41.     return ;
  42. }
  43.  
  44. int countDivisor(int n)
  45. {
  46.     int cnt = 1,divisor = 1,i;
  47.  
  48.     for(i=0; prime[i]*prime[i]<=n; i++)
  49.     {
  50.         if(n%prime[i]==0)
  51.         {
  52.             cnt = 1;
  53.  
  54.             while(n%prime[i]==0)
  55.             {
  56.                 n/=prime[i];
  57.  
  58.                 cnt++;
  59.             }
  60.  
  61.             divisor*=cnt;
  62.         }
  63.     }
  64.  
  65.     if(n!=1)
  66.     {
  67.         divisor*=2;
  68.     }
  69.  
  70.     return divisor;
  71. }
  72.  
  73. void solve()
  74. {
  75.     int i;
  76.  
  77.     NOD[1] = 1;
  78.  
  79.     for(i=2; i<MAX; i++)
  80.     {
  81.         NOD[i] = countDivisor(i);
  82.     }
  83.  
  84.     sequence.push_back(1);
  85.  
  86.     vis[1] = 1;
  87.  
  88.     while(sequence.back()<=1000000)
  89.     {
  90.         sequence.push_back(sequence.back()+NOD[sequence.back()]);
  91.  
  92.         vis[sequence.back()] = 1;
  93.     }
  94.  
  95.     for(i=1; i<MAX; i++)
  96.     {
  97.         vis[i]+=vis[i-1];
  98.     }
  99.  
  100.     return ;
  101. }
  102.  
  103. int main()
  104. {
  105.     sieve();
  106.  
  107.     solve();
  108.  
  109.     int n,test,i,j,tc,L,R,l,h;
  110.  
  111.     scanf("%d",&test);
  112.  
  113.     for(tc = 1; tc<=test; tc++)
  114.     {
  115.         scanf("%d%d",&L,&R);
  116.  
  117.         printf("Case %d: %d\n",tc,vis[R]-vis[L-1]);
  118.     }
  119.  
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement