Evanyou Blog 彩带

洛谷P2789 直线交点数 [数论,递归]

  题目传送门

题目描述

平面上有N条直线,且无三线共点,那么这些直线能有多少不同的交点数?

输入格式

一个正整数N

输出格式

一个整数表示方案总数

输入输出样例

输入 #1
 4
输出 #1
 5

说明/提示

N<=25


  分析:

  给定你$n$条直线,如果其中有$i$条平行,其他的不平行,那么交点数就是$(i*(n-i))$+($n-i$条直线的交点数)。那么我们就可以递归求出$n$条直线所有可能的方案(因为$n$很小),然后记录方案数就行了。

  其实也就等价于把这$n$条直线分成若干个平行的直线组,然后一组一组的加上交点数。

  Code:

 

//It is made by HolseLee on 16th Aug 2019
//Luogu.org P2789
#include<bits/stdc++.h>
using namespace std;

int n,ans;
bool vis[50005];

void dfs(int now,int num)
{
    if( now==0 ) { 
        if( !vis[num] ) ans++; 
        vis[num]=1; return;
    }
    for(int i=now; i>=1; --i) dfs(now-i,i*(now-i)+num);
}

int main()
{
    cin>>n; dfs(n,0); cout<<ans; return 0;
}

 

 

 

posted @ 2019-08-16 21:22  HolseLee  阅读(797)  评论(0编辑  收藏  举报