JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

该博客主要介绍了NOIP2016提高组竞赛中的一道题目,即如何计算给定直线能组成多少个三角形。博主通过分析问题,提出了一种先计算最大可能的三角形数,再排除不合法组合的方法。具体策略是先对直线按斜率排序,统计相同斜率的直线数量,然后应用组合数学公式计算结果。代码部分展示了实现这一策略的C++程序。
摘要由CSDN通过智能技术生成

JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

题目

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

6
0 1 0
-5 3 0
-5 -2 25
0 1 -3
0 1 -2
-4 -5 29

Sample Output

10

Data Constraint

在这里插入图片描述

题解

题意

给出 n n n个条直线的解析式,问这些直线能组成多少个三角形

题解

发现直接求解不容易求
想到可以先求出最大数量再减去不合法的
最大数量 C n 3 C_n^3 Cn3,不合法的有两种

  1. 两条平行线+一条不平行的
  2. 三条平行线

那么可以求出斜率然后按照斜率排序,求出每种相同斜率的个数 c [ i ] c[i] c[i],和总共斜率的个数 t t t
答案就是 C n 3 − ∑ i = 1 t C c [ i ] 2 ∗ ( n − c [ i ] ) + C c [ i ] 3 C_n^3-\sum_{i=1}^tC_{c[i]}^2*(n-c[i])+C_{c[i]}^3 Cn3i=1tCc[i]2(nc[i])+Cc[i]3

Code

#include<cstdio>
#include<algorithm>
#define mod 1000000007
using namespace std;
long long n,ans,t,c[300001];
struct node
{
	long long x,y,z;
}s[300001];
long long read()
{
	long long res=0,fh=1;char ch=getchar();
	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if (ch=='-') fh=-1,ch=getchar();
	while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
	return res*fh;	
} 
bool cmp(node x,node y)
{
	double pd1=x.y?(double)-x.x/x.y:1e100;
	double pd2=y.y?(double)-y.x/y.y:1e100;
	return pd1<pd2;
}
long long C3(long long x) {return (x*(x-1)*(x-2)/6%mod);}
long long C2(long long x) {return (x*(x-1)/2)%mod;}
int main()
{
	freopen("trokuti.in","r",stdin);
	freopen("trokuti.out","w",stdout);
	n=read();
	ans=C3(n);
	for (int i=1;i<=n;++i)
		s[i].x=read(),s[i].y=read(),s[i].z=read(); 
	sort(s+1,s+n+1,cmp);
	int i=1,j=1;
	while (i<=n)
	{
		while (j<=n&&s[i].x*s[j].y==s[i].y*s[j].x) ++j;
		c[++t]=j-i;
		i=j; 
	}
	for (int i=1;i<=t;++i)
		ans=(ans+mod-(C2(c[i])*(n-c[i])%mod)-C3(c[i])+mod)%mod;
	printf("%lld\n",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值