BZOJ 1800 [Ahoi2009]fly 飞行棋

时间:2024-04-14 10:17:26

题目链接

思路

终于有一道自己想出来的题了,开心。

因为是矩形,一定有直角,所以考虑直径,之后由于矩形对角线是两条直径,所以考虑组合数。

直径有n条,矩形有c(n,2)个。

 #include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int res,hf,sum[],a[];
map<int,int>mp;
long long fac(int k)
{
long long ans=;
for(int i=;i<=k;i++)
ans*=i;
return ans;
}
long long cb(int n,int m)
{
return (fac(n)/fac(m))/fac(n-m);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",a+i);
sum[i]=sum[i-]+a[i];
mp[sum[i]]++;
}
if(sum[n]%!=)
{
printf("0\n");
return ;
}
hf=sum[n]/;
for(int i=;i<=n;i++)
{
if(sum[i]>hf)
break;
if(mp[sum[i]+hf])
res++;
}
printf("%lld\n",cb(res,));
return ;
}