洛谷P2789 直线交点数 题解

解题思路

考虑将直线分组,每组内直线互相平行,任意两组直线间交点数量等于两组内直线数量乘积。
分组操作使用dfs,求出交点数量后加入set去重,输出set大小。
时间复杂度O(2NN2)有点鬼畜但是可以通过。

实现

#include <cstdio>
#include <unordered_set>
int a[30];
std::unordered_set<int> st;
int n;
void dfs(int x,int t)
{
	if(x==n)
	{
		int sum=0;
		for(int i=1;i<=t;i++)
		{
			for(int j=1;j<i;j++)
				sum+=a[i]*a[j];
		}
		st.insert(sum);
	}
	for(int i=x+1;i<=n;i++)
	{
		a[t+1]=i-x;
		dfs(i,t+1);
	}
}
int main()
{
	scanf("%d",&n);
	dfs(0,0);
	printf("%d",st.size());
}
posted @ 2024-08-14 18:04  整齐的艾萨克  阅读(84)  评论(0)    收藏  举报