直线分割平面问题:
1、公式:a[i]=a[i-1]+(i-2),b[i]=b[i-1]+2,f[i]=a[i]+b[i];//a[i]为分割之后的内部,b[i]为分割之后的外部,f为直线分割平面的数量。
2、注解:对于第n条直线:
内部:每次直线最多于之前的n-1条直线相交产生n-1个交点->n-2个新块
外部:每次最多将两个块一分为二
折线分割平面问题:
1、公式:a[i]=a[i-1]+(i-2),b[i]=b[i-1]+2,f[i]=a[2x]+b[2x]-2x;//a和b同直线,f为折线分割平面的数量。
2、注解:同直线分割平面问题,折线就相当于两个直线减去两个新块
#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL a[20100],b[20100],c[10100];
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
a[1]=0,b[1]=2;c[1]=2;
for(int i=2;i<=20000;i++)
{
a[i]=a[i-1]+(i-2);
b[i]=b[i-1]+2;
}
for(int i=2;i<=10000;i++)
{
c[i]=a[2*i]+b[2*i]-2*i;
}
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<c[n]<<"\n";
}
return 0;
}
平面分割空间
1、公式:g[i]=g[i-1]+i,f[i]=f[i-1]+g[i-1];
2、注解:n-1个平面->f[n-1]
要想最多,那么第n个平面与前n-1个平面相交且交线不重合->产生n-1条交线
n-1个交线会将第n个平面分成g[i-1]个区域,->将原有的空间一份为二
#include <bits/stdc++.h>
#define LL long long int
using namespace std;
LL a[1010],b[1010];
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
a[1]=2;
b[1]=2;
for(int i=2;i<=1000;i++)
{
b[i]=a[i-1]+b[i-1];
a[i]=a[i-1]+i;
}
int n;
while(cin>>n)
{
if(n==0) break;
cout<<b[n]<<"\n";
}
return 0;
}