Luogu P2789 直线交点数
题目描述:
平面上有\(N\)条直线,且无三线共点,那么这些直线能有多少不同的交点数?
这道题的关键在于: 我们认为线与线之间只存在平行或相交,而不考虑具体位置,并且无三线共点。
因此我们只需考虑直线的平行与相交关系。
此题的目的是求交点方案数
如何求交点:
可以从简单的来看:
一条直线,必然只有一种方案;
两条直线:两条直线平行,\(0\)个交点,两条直线相交,\(1\)个交点,两种方案
三条直线:
四条直线:
五种方案;
通过上面的举例,发现可以按照有几条直线平行进行讨论;
如果\(m\)条直线有\(r\)条直线平行,那么剩下的\((m-r)\)条直线,每条直线都会与这\(r\)条直线相交
也就会产生\(r*(m-r)\)个交点,然后再考虑这剩下的\((m-r)\)条直线内部的相交平行关系,我们发现这是一个递归问题
因此我们可以递归来做,因为要求的是共有几种不同的交点方案,因此我们可以将每一种不同的方案求出来的交点数标记,最后统计答案;
\(code:\)
#include<bits/stdc++.h>
using namespace std;
int n,ans;
bool p[10010];
int g(int n,int k) {
if(n==0)
p[k]=1;
else
for(int i=n;i>=1;i--)
g(n-i,i*(n-i)+k);
}
int main() {
scanf("%d",&n);
g(n,0);
for(int i=0;i<=10009;i++)
if(p[i])
ans++;
printf("%d",ans);
return 0;
}