前置知识
欧拉定理:在任何一个规则球面地图上,用RRR记区域个 数,VVV记顶点个数 ,EEE记边界个数 ,则R+V−E=2R+ V- E= 2R+V−E=2。
Solution
R=E−V+2R=E-V+2R=E−V+2
已经存在nnn个点 nnn
任意四个点可以有一个交点Cn4C_n^4Cn4
V=n+Cn4V=n+C_n^4V=n+Cn4
每两个点有一条边Cn2C_n^2Cn2
一条线段会被一个交点分成两段,所以xxx条直线的交点会多分出来xxx条线段,利用VVV可以算出EEE
每四个点的交点就会在原来2条线断的基础上又增加两个线段2Cn42C_n^42Cn4
E=Cn2+2Cn4E=C_n^2+2C_n^4E=Cn2+2Cn4
R=E−V+2=Cn2−Cn4−n+2R=E-V+2=C_n^2-C_n^4-n+2R=E−V+2=Cn2−Cn4−n+2
多边形外面的区域不算需要−1-1−1
ans=R−1=E−V+2=Cn2−Cn4−n+1ans=R-1=E-V+2=C_n^2-C_n^4-n+1ans=R−1=E−V+2=Cn2−Cn4−n+1
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll N = 1e6 + 5;
ll qpow(ll x,ll y){
ll ans=1;
x%=mod;
while(y>0){
if(y&1) ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
ll C(ll x,ll y){
ll ans=1;
for(ll i=x;i>x-y;i--){
ans=ans*i%mod;
}
ll res=1;
for(ll i=1;i<=y;i++){
res=res*i%mod;
}
return ans*qpow(res,mod-2)%mod;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n;
cin>>n;
cout<<((C(n,2)+C(n,4)-n+1)%mod+mod)%mod<<'\n';
return 0;
}

本文介绍了一种利用欧拉定理解决几何问题的方法,通过计算点、边和区域的数量来得出多边形划分的答案,并提供了一个C++实现的示例。

2612

被折叠的 条评论
为什么被折叠?



