前置知识
欧拉定理:在任何一个规则球面地图上,用 R R R记区域个 数, V V V记顶点个数 , E E E记边界个数 ,则 R + V − E = 2 R+ V- E= 2 R+V−E=2。
Solution
R = E − V + 2 R=E-V+2 R=E−V+2
已经存在
n
n
n个点
n
n
n
任意四个点可以有一个交点
C
n
4
C_n^4
Cn4
V
=
n
+
C
n
4
V=n+C_n^4
V=n+Cn4
每两个点有一条边
C
n
2
C_n^2
Cn2
一条线段会被一个交点分成两段,所以
x
x
x条直线的交点会多分出来
x
x
x条线段,利用
V
V
V可以算出
E
E
E
每四个点的交点就会在原来2条线断的基础上又增加两个线段
2
C
n
4
2C_n^4
2Cn4
E
=
C
n
2
+
2
C
n
4
E=C_n^2+2C_n^4
E=Cn2+2Cn4
R = E − V + 2 = C n 2 − C n 4 − n + 2 R=E-V+2=C_n^2-C_n^4-n+2 R=E−V+2=Cn2−Cn4−n+2
多边形外面的区域不算需要
−
1
-1
−1
a
n
s
=
R
−
1
=
E
−
V
+
2
=
C
n
2
−
C
n
4
−
n
+
1
ans=R-1=E-V+2=C_n^2-C_n^4-n+1
ans=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;
}