//dp的数学题-W-,从没有平行线开始叠加计算焦点集合数;
#include<stdio.h>//b
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[22][222];
int m,n,r; //m非相互平行直线,r相互平行直线。
void solve(){ //打个表先
memset(dp,0,sizeof(dp));
m = 0;dp[0][0] = 1;dp[1][0] = 1;
for(int i=2; i<=20; i++){
for(int j=0; j<i; j++){
for(int k=0; k<=j*(j-1)/2; k++){
if(dp[j][k]){
m = k+(i-j)*j; //有i条平行线下的交点数 ;
dp[i][m] = 1;
}
}
}
}
}
int main(){
while(cin>>n){
solve();
for(int i=0; i<=n*(n-1)/2; i++){
if(dp[n][i] == 1){ //标记过就代表可以输出这个点
if(i == 0){
printf("%d",i);
}
else{
printf(" %d",i);//格式仿佛在逗我
}
}
}
printf("\n");
}
return 0;
}
计算直线的交点数
最新推荐文章于 2017-09-02 16:12:23 发布