MarioYC

visible points 2D

Dec 6th, 2012
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <algorithm>
  7. #include <string>
  8. #include <vector>
  9. #include <queue>
  10. #include <stack>
  11. #include <map>
  12. #include <set>
  13.  
  14. using namespace std;
  15.  
  16. #define MAXN 1000000
  17.  
  18. int mu[MAXN + 1],factor[MAXN + 1];
  19.  
  20. long long visible(int X, int Y){
  21.     if(X == 0 || Y == 0) return 1;
  22.    
  23.     long long ret = 2;
  24.    
  25.     for(int i = 1;i <= min(X,Y);++i)
  26.         ret += mu[i] * (X / i) * (Y / i);
  27.    
  28.     return ret;
  29. }
  30.  
  31. int main(){
  32.     ios::sync_with_stdio(0);
  33.    
  34.     memset(factor,-1,sizeof factor);
  35.     mu[1] = 1;
  36.    
  37.     for(int i = 2;i <= MAXN;++i){
  38.         if(factor[i] == -1){
  39.             mu[i] = -1;
  40.            
  41.             if(i <= MAXN / i)
  42.                 for(int j = i*i;j <= MAXN;j += i)
  43.                     factor[j] = i;
  44.         }else{
  45.             int cont = 0,aux = i,p = factor[i];
  46.            
  47.             while(aux % p == 0 && cont < 2){
  48.                 aux /= p;
  49.                 ++cont;
  50.             }
  51.            
  52.             if(cont == 2) mu[i] = 0;
  53.             else mu[i] = -mu[i / p];
  54.         }
  55.     }
  56.    
  57.     int X,Y;
  58.    
  59.     cin >> X >> Y;
  60.    
  61.     cout << visible(X,Y) << endl;
  62.    
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment