C. 平面分割(surface) [ Discussion ]
Description
同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域?
Input
两个整数n(n≤500)和p(2≤p≤n)。
Output
一个正整数,代表最多分割成的区域数目。
Samples
Input Copy
12 5
Output
73
Discussions
No more discussions
More>>
下面介绍一个规律解法进行AC:
代码只有一行?
一个公式而已
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n,p;
ll res;
cin>>n>>p;
cout<<2*n+(n-p)*(p-1+n-2)/2;
return 0;
}
那么这个公式怎么来的呢?
举例子!找规律!
拿出一张纸
画一个正方形
连起来对角线;
假设n=p=3;(从正方形中间画一条水平线,过对角线交点)
分成平面res=2x3=6;
n=3,p=2;
你把中间那条线往上移一下,让它满足p=2(两条线一个交点)
res=2x3+1;此时p=2;
假设n=p=4;
同样在n=3的基础上竖直过交点画一条线
res=2x4=8;
n=4,p=3;
移动一条(同上)
res=2x4+2=10;
n=4,p=2;
res=2x4+2+1=10+1;
到这应该能知道规律了吧?
是不是每一项都是上一项的res+此时的p-1?
n=4
p=4,res=2X4;
p=3,res=2X4+2;
p=2,res=2X4+2+1;
如果还看不出来,你就直接拿样例12 5去试一试;
n=12;
p=12,res=2x12;
p=11,res=2x12+10;
p=10,res=2x12+10+9;
p=9,res=2x12+10+9+8;
…
p=5,res=2x12+10+9+8+7+6+5+4=73;
所以我只需要求2xn+后面的等差数列就行了,后面不说了,自己动脑子吧!
另一种方法是f(n)=f(n-1)+n;
两种思维,第一种不好理解,去找第二种,第二种很多博客,所以此处介绍第一种。