题目链接
- asin、acos、atan:反正弦、反余弦、反正切函数
- 可以利用以上函数得到Π的值
- 注意1的特判
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct t1
{
long long x,y;
}t[100005];
t1 operator-(t1 a,t1 b)
{
t1 tmp;
tmp.x=a.x-b.x;
tmp.y=a.y-b.y;
return tmp;
}
long long c(t1 a,t1 b)
{
return a.x*b.y-a.y*b.x;
}
double p(t1 a,t1 b)
{
return a.x*b.x+a.y*b.y;
}
double l(t1 a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
bool cmp(t1 a,t1 b)
{
t1 h1=a-t[1];
t1 h2=b-t[1];
if(c(h1,h2)!=0)
{
return c(h1,h2)>0;
}
return h1.x<h2.x;
}
long long s[100005],tot,cnt[200];
int main()
{
long long n;
cin>>n;
for(long long i=1;i<=n;i++)
{
t[i].x=read1();
t[i].y=read1();
if(t[i].y<t[1].y||t[i].y==t[1].y&&t[i].x<t[1].x)
{
swap(t[i],t[1]);
}
}
sort(t+2,t+n+1,cmp);
tot=1;
s[1]=1;
for(long long i=2;i<=n;i++)
{
while(tot>1)
{
t1 h1=t[i]-t[s[tot]];
t1 h2=t[s[tot]]-t[s[tot-1]];
if(c(h1,h2)>=0)
{
tot--;
}
else
{
break;
}
}
tot++;
s[tot]=i;
}
tot++;
s[tot]=1;
tot++;
s[tot]=s[2];
for(long long i=2;i<=tot-1;i++)
{
t1 h1=t[s[i-1]]-t[s[i]];
t1 h2=t[s[i+1]]-t[s[i]];
double d=acos(p(h1,h2)/l(h1)/l(h2));
d=d/acos(-1)*180;
int D=floor(d);
cnt[D]++;
}
long long ans=cnt[1]*(cnt[1]-1)/2;
for(long long i=0;i<180;i++)
{
for(long long j=i+1;j<180;j++)
{
if(gcd(i,j)==1)
{
ans=ans+cnt[i]*cnt[j];
}
}
}
cout<<ans<<endl;
return 0;
}