include[HTML_REMOVED]
using namespace std;
const int N = 2e6+10; // 尽量把直线数开多一点 , 反正时间效率不影响
struct length
{
// 从斜率和截距两个角度筛选
double k,b;
bool operator< (const length&w)const
{
if(k != w.k) return k < w.k; // 如果两个直线斜率不同 , 就优先比斜率
return b < w.b; // 如果直线斜率相同,再比截距
}
}L[N];
int main()
{
int res = 0 , cnt = 0;
// 依次遍历每两个点
for(int x1 = 0 ; x1 < 20 ; x1++)
{
for(int y1 = 0 ; y1 < 21 ; y1++)
{
for(int x2 = 0 ; x2 < 20 ; x2++)
{
for(int y2 = 0 ; y2 < 21 ; y2++)
{
if(x1 != x2) // k是可以等于0的
{
double k = 1.0 * (y2 - y1) / (x2 - x1);
double b = y1 - k*x1;
L[cnt++] = {k,b};
}
}
}
}
}
sort(L,L+cnt);
// 遍历所有找到的直线,若两个直线有相同则res不加加
for(int i = 0 ; i < cnt ; i ++)
{
if(fabs(L[i].k - L[i+1].k) > 1e-4 || fabs(L[i].b - L[i+1].b) > 1e-4) res++;
}
// 但是此时找到的只是所有的斜线还得再加上直线的数量 竖20 ( 0 ~ 19 ) ( k可以为0,能表示横过来的直线)
cout << res + 20;
return 0;
}