欧拉公式V−E+F=2所以找出顶点数和边数就行了,枚举两个点,在左半边的如果有i个,右边有n−i−2个,交点个数 i∗(n−i−2)(其实感觉不太明白为啥钦定交点不重合,感觉是因为重合了会使答案变差),然后这条线段被分成了 i∗(n−i−2)+1部分,然后外围凸包上的边有n条,圆弧分成了n段,所以V,E就能算出来了
![](https://img-blog.csdn.net/20180125161147830?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY0MjQ1NDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20180125161045879?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY0MjQ1NDA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
关于__int128
讲道理的话,gcc是不认识_
_int128
这种数据类型的,比如Dev cpp也是无法编译的,但是提交到大部分
OJ
上是可以编译且能用的。
C/C++
标准
IO
是不认识__int128这种数据类型的,因此要自己实现
IO
,其他的运算,与
int
没有什么不同。
定义
__int128 n,r,g,b,T;
__int128 ans;
__int128 f[1025][1025];
取最大值函数
__int128 getmax(__int128 a,__int128 b){
if (a>b) return(a);else return(b);
}
输出
void print(__int128 x){
if (x==0) return;
if (x) print(x/10);
putchar(x%10+'0');
}
其余与整形类似,对于略大于LL范围值计算方便
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
void print(__int128 ans){
if(ans==0)
return;
print(ans/10);
printf("%d",ans%10);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
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;
}