import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入:N(点位数量)、基地X0、Y0
int N = scanner.nextInt();
int x0 = scanner.nextInt();
int y0 = scanner.nextInt();
// 存储「最简斜率」的计数(键:斜率的最简分数形式,值:出现次数)
Map<String, Integer> directionMap = new HashMap<>();
for (int i = 0; i < N; i++) {
int xi = scanner.nextInt();
int yi = scanner.nextInt();
// 计算相对基地的偏移量
int dx = xi - x0;
int dy = yi - y0;
// 生成最简形式的方向标识
String direction = getReducedForm(dx, dy);
// 记录该方向
directionMap.put(direction, directionMap.getOrDefault(direction, 0) + 1);
}
// 不同方向的数量就是最小路线数
System.out.println(directionMap.size());
scanner.close();
}
// 将(dx, dy)约分为最简分数形式,返回唯一标识字符串
private static String getReducedForm(int dx, int dy) {
if (dx == 0 && dy == 0) {
return "0,0"; // 理论上不会出现(基地本身不是拾取点)
}
// 计算最大公约数(GCD)
int gcd = gcd(Math.abs(dx), Math.abs(dy));
if (gcd != 0) {
dx /= gcd;
dy /= gcd;
}
// 统一符号:让分子为正(若分子为0,让分母为正),避免(-1,1)和(1,-1)被误判为不同方向
if (dx < 0) {
dx = -dx;
dy = -dy;
} else if (dx == 0) {
if (dy < 0) {
dy = -dy;
}
}
return dx + "," + dy;
}
// 计算两个数的最大公约数(欧几里得算法)
private static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
}