UVa 10213 How Many Pieces of Land (欧拉定理)

本文通过欧拉公式推导出计算特定几何图形顶点数(V)和边数(E)的公式,并给出了一种高效算法实现。利用__int128数据类型避免大数运算中的溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解:根据欧拉定理V+F-E = 2,V是点数,E是边数,F是面数

欧拉公式VE+F=2所以找出顶点数和边数就行了,枚举两个点,在左半边的如果有i个,右边有ni2个,交点个数i(ni2),然后这条线段被分成了i(ni2)+1部分,然后外围凸包上的边有n条,圆弧分成了n段,所以V,E就能算出来了。

V=n+n4i=1n3i(n2i)因为经过交点的有两条线会被求4次

E=2n+n2i=1n3(i(n2i)+1)因为边又两个点会被求2次所以n/2
上面外加的n,2n是因为刚才本身的点和相邻的边没有算

化简一下就是124(n463+23n218n)+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;
}


124(n463+23n218n)+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值