题解:根据欧拉定理V+F-E = 2,V是点数,E是边数,F是面数
欧拉公式
V−E+F=2
所以找出顶点数和边数就行了,枚举两个点,在左半边的如果有
i
个,右边有
n−i−2
个,交点个数
i∗(n−i−2)
,然后这条线段被分成了
i∗(n−i−2)+1
部分,然后外围凸包上的边有n条,圆弧分成了n段,所以V,E就能算出来了。
V=n+n4∑i=1n−3i(n−2−i)因为经过交点的有两条线会被求4次
E=2n+n2∑i=1n−3(i(n−2−i)+1)因为边又两个点会被求2次所以n/2
上面外加的n,2n是因为刚才本身的点和相邻的边没有算
化简一下就是124(n4−63+23n2−18n)+1
因为n比较大用long long 数值会爆所以我们可以用__int128操作
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
#define rep(a,b) for(int i = a; i <= b; i++)
#define dec(a,b) for(int i = a; i >= b; i--)
#define root 1,1,n
#define ls 2*rt
#define rs 2*rt+1
#define mid (L+R)/2
#define lson ls,L,mid
#define rson rs,mid+1,R
#define fi first
#define se second
typedef long long int ll;
const int mx = 1e5+5;
void print(__int128 ans){
if(ans==0)
return;
print(ans/10);
printf("%d",ans%10);
//print(ans/10);
}
int main(){
int n;
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
__int128 x = n;
__int128 ans = (x*x*x*x + 23*x*x-6*x*x*x-18*x)/24+1;
print(ans);
puts("");
}
return 0;
}