C. Line-line Intersection传送门
本题的关键在于重合直线的巧妙计数;
#include<bits/stdc++.h>
#define LL long long
using namespace std;
map<pair<LL,LL> , LL> mp;
map<pair<pair<LL,LL>,LL>,LL> mmp;
int main()
{
int t;
cin>>t;
while(t--)
{
mp.clear() ;
mmp.clear() ;
LL sum=0;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
LL a,b,c,d;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
LL gcd = __gcd(a-c,b-d);
LL A = ++mp[{(b-d)/gcd,(a-c)/gcd}];
LL B = ++mmp[{{(b-d)/gcd,(a-c)/gcd},(b-d)/gcd*a+(a-c)/gcd*b}];
sum+=i+B-A;
}
cout<<sum<<endl;
}
return 0;
}