I题Sky Garden
昨晚之后发现别人的思路都和自己的不太一样。。。(不过好像所有人这道题写的都不太一样)这个思路其实挺难讲清楚的,代码中base的倍数就是每个圆内两点互达的所有组合之和,然后单独算圆与圆之间的部分,累加之后把结果输出就a了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
const int maxn=10000;
double angle[maxn];
int main()
{
int n=read(),m=read();
double ans=0;
double pi=acos(-1.0);
double base=0;
for(int i=1;i<=2*m;i++)
{
angle[i]=(i-1)*pi/(m);
}
for(int i=1;i<=2*m;i++)
{
for(int j=i+1;j<=2*m;j++)
{
base+=min(2.0,min(abs(angle[j]-angle[i]),abs(angle[i]+2*pi-angle[j])));
}
}
for(int i=1;i<=n;i++)
{
ans+=base*i;
if(m!=1)
ans+=2*m*i;
for(int j=1;j<i;j++)
{
ans+=2*m*2*m*(i-j);
ans+=j*base*2;
}
}
printf("%.10lf",ans);
}