4309. 消灭老鼠(gcd,斜率转pair)

发布时间 2023-03-29 11:26:45作者: 风乐

https://www.acwing.com/problem/content/4312/
要点就是斜率相同时可以被一束激光打到
而斜率有可能在轴上,计算斜率可能导致分母为0,于是采用pair对的形式去存储而不是直接计算
存储为pair对后再映射除以最大公约数,相当于约分,用set自动去重就可以知道有多少种约分方式
有多少种就说明有多少斜率不同的点

#include<iostream>
#include<set>

using namespace std;

const int N = 1010;

typedef pair<int,int>PII;

int x0,y0;

int gcd(int a, int b)
{
    return b ? gcd(b,a%b) : a;
}


int main()
{
    set<PII>S;
    int n;
    cin >> n >> x0 >> y0;
    while(n--)
    {
        int x,y;
        cin >> x >> y;
        x-=x0,y-=y0; //把所有坐标映射到以x0,y0为原点的坐标系上
        int d=gcd(x,y); //求最大公约数
        x/=d,y/=d;   //映射坐标到公共点上,有多少个公共点就有多少个斜率相同的点
        S.insert({x,y});  
    }
    cout << S.size() << endl;
}