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

题解:根据欧拉定理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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值