/*
 * author: cyclexit
 * start from: 2021-01-05 10:21
 */
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

inline double slope(pair<double, double> x, pair<double, double> y) {
  return fabs(y.second - x.second) / fabs(y.first - x.first);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<pair<double, double>> point(n);
  for (int i = 0; i < n; ++i) {
    cin >> point[i].first >> point[i].second;
  }
  int ans = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      if (point[i].first != point[j].first) {
        if (-1.0 <= slope(point[i], point[j]) && slope(point[i], point[j]) <= 1.0) {
          ++ans;
        }
      }
    }
  }
  cout << ans << '\n';
  return 0;
}
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<int,pair<int,int>> piii;

template <typename T>
using ordered_set = __gnu_pbds::tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

ll gcd(ll a, ll b){
  if (b==0) return a;
  return gcd(b, a%b);
}
const int N = 2000;
ll a[N];
unordered_map<int, int> gcds;
int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  
  int n; cin >> n;
  ll lo = 1e18;
  for (int i = 0; i < n; i++){
    cin >> a[i];
    lo = min(a[i], lo);
  }

  for (int i = 0; i < n; i++){
    for (int d = 1; d*d <= a[i]; d++){
      if (a[i]%d != 0) continue;
      gcds[d] = gcd(gcds[d], a[i]);
      gcds[a[i]/d] = gcd(gcds[a[i]/d], a[i]);
    }
  }

  int ans = 1;
  for (auto g : gcds){
    if (g.first == g.second && g.first < lo) ans++;  
  }
  cout << ans << endl;
  return 0;
}
