uva 10213 How Many Pieces of Land (欧拉公式计算多面体)

题意:在一个圆上取n个点,求最多能将圆分为多少块;

思路:欧拉公式计算多面体;

欧拉公式:简单多面体的顶点数V、面数F及棱数E之间的关系为V+F-E=2;

首先考虑点数v,有n个在圆上的点,任取一点x,考虑与x相连的每条对角线,假设对角线左边有i个顶点,则右边应有(n-2-i)个顶点,这些顶点相互连接可以产生i*(n-i-2)个顶点,再将所有的x与所有的对角线l求和。每个交点分别算了4次(一个交点由两条线产生,有4个圆上的点会计算到),除以4:

V=n+n/4*(西格玛i=1到n-3) i*(n-i-2);

然后考虑边数E,有n条边在圆上(圆弧),有n条边为相邻两点所形成,上面并没有交点,对于其他的边,若该边上有 i*(n-i-2) 个交点,则其被划分成 i*(n-i-2)+1条线段,而每条这样的线段在求和中会被原对角线的两个交点各算一次,所以还要除以2,:

E=2*n+n/2*(西格玛i=1到n-3)[i*(n-i-2)+1];

使用平方和公式将上面两个式子代入欧拉公式,然后扣除最外层无限大的那个面,可得:

F=(n^4-6*n^3+23*n^2-18*n)/24+1;

F可能超出任何整数类型允许的范围,需要采用高精度运算。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long int64;
int64 m=1e8;
struct Bigint{
    int64 s[50];
    int l;
    void print(){           //输出
        printf("%lld",s[l]);
        for(int i=l-1;i>=0;i--) printf("%08lld",s[i]);
    }
    void read(int64 x){     //转为整数数组
        l=-1;
        memset(s,0,sizeof(s));
        do{
            s[++l]=x%m;
            x/=m;
        }while(x);
    }
}ans,tmp,t2;
Bigint operator +(Bigint a,Bigint b){  //大数相加
    int64 d=0;
    a.l=max(a.l,b.l);
    for(int i=0;i<=a.l;i++){
        a.s[i]+=d+b.s[i];
        d=a.s[i]/m;
        a.s[i]%=m;
    }
    if(d) a.s[++a.l]=d;
    return a;
}
Bigint operator -(Bigint a,Bigint b){   //大数相减
    int64 d=0;
    for(int i=0;i<=a.l;i++){
        a.s[i]-=d;
        if(a.s[i]<b.s[i]) a.s[i]+=m,d=1;
        else d=0;
        a.s[i]-=b.s[i];
    }
    while(a.l&&!a.s[a.l]) a.l--;
    return a;
}
Bigint operator *(int b,Bigint a){     //小数乘大数
    int64 d=0;
    for(int i=0;i<=a.l;i++){
        d+=a.s[i]*b;
        a.s[i]=d%m;
        d/=m;
    }
    while(d){
        a.s[++a.l]=d%m;
        d/=m;
    }
    return a;
}
Bigint operator /(Bigint a,int b){       //大数除小数
    int64 d=0;
    for(int i=a.l;i>=0;i--){
        d*=m;
        d+=a.s[i];
        a.s[i]=d/b;
        d%=b;
    }
    while(a.l&&!a.s[a.l]) a.l--;
    return a;
}
Bigint operator *(Bigint a,Bigint b){   //大数相乘
    Bigint c;
    memset(c.s,0,sizeof(c.s));
    for(int i=0;i<=a.l;i++){
        for(int j=0;j<=b.l;j++){
            c.s[i+j]+=a.s[i]*b.s[j];
            if(c.s[i+j]>m){
                c.s[i+j+1]+=c.s[i+j]/m;
                c.s[i+j]%=m;
            }
        }
    }
    c.l=a.l+b.l+10;
    while(!c.s[c.l]&&c.l) c.l--;
    while(c.s[c.l]>m){
        c.s[c.l+1]+=c.s[c.l]/m;
        c.s[c.l++]%=m;
    }
    return c;
}
int v;
void work(){
    ans.read(v);
    tmp.read(24);//将24转化为整数数组
    ans=ans*ans*ans*ans+23*(ans*ans)+tmp-6*(ans*ans*ans)-18*ans;
    ans=ans/24;
    ans.print();
    printf("\n");
}
int main(){
    int cas;
    scanf("%d",&cas);
    while(cas--){
        scanf("%d",&v);
        work();
    }
    return 0;
}
时间: 2024-10-25 05:21:27

uva 10213 How Many Pieces of Land (欧拉公式计算多面体)的相关文章

UVA 10213 How Many Pieces of Land? 欧拉定理

欧拉定理 V-E+F=C+1 Problem G How Many Pieces of Land? Input: Standard Input Output: Standard Output Time Limit: 3 seconds   You are given an elliptical shaped land and you are asked to choose n arbitrary points on its boundary. Then you connect all these

UVa 10213 - How Many Pieces of Land ?(欧拉公式)

链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1154 题意: 有一块椭圆形的地.在边界上选n(0≤n<2^31)个点并两两连接得到n(n-1)/2条线段.它们最多能把地分成多少个部分? 分析: 本题需要用到欧拉公式:在平面图中,V-E+F=2,其中V是顶点数,E是边数,F是面数.因此,只需要计算V和E即可(注意还要减去外面

UVA - 10213 How Many Pieces of Land?(欧拉公式 + 高精度)

圆上有n个点,位置不确定.问这些点两两连接成的线段,最多可以把圆划分成多少块平面? 欧拉公式:V-E+F = 2,V是点数,E是边数,F是面数. 答案是F=C(n,4)+C(n,2)+1,看的别人推的..我实在推不出来. 写这篇博客的原因是第一次用Java的BigInteger. import java.math.BigInteger; import java.util.*; public class Main{ static Scanner sc = new Scanner(System.in

【分割圆】Uva 10213 - How Many Pieces of Land ?

一个椭圆上有N个点,将这n个点两两相连,问最多能将这个椭圆分成多少片. 理清思路,慢慢推. 首先我们要想到欧拉公式:V+E-F=2 其中V为图上的顶点数,E为边数,F为平面数. 计算时的可以枚举点,从一个固定点出发的对角线(注意是对角,不包括与相邻点的连线),它的左边有i个点,那么右边就有n-2-i个点.左边与右边的点两两相连,能在这一条对角线上相交i*(n-2-i)各点. 一个固定点能与其他非相邻点连接n-3条对角线,那么一个固定点的连线就会生成sigema(i=1,n-3)(i*(n-2-i

UVa 10213 How Many Pieces of Land ? (计算几何+大数)

题意:一块圆形土地,在圆周上选n个点,然后两两连线,问把这块土地分成多少块? 析:这个题用的是欧拉公式,在平面图中,V-E+F=2,其中V是顶点数,E是边数,F是面数.对于这个题只要计算V和E就好. 我们从一个顶点开始枚举对角线,这条线左边有 i 个点,那么右边有 n-i-2 个点,那么两边的连线在这条对角线上形成 i * (n-i-2) 个交点,得到 i * (n-i-2) + 1条线段,然而每个交点, 重复计算了四次,每条线段被重复计算了二次,所以总数就是,,V 加 n 的意思就是加上原来的

UVa 10213 (欧拉公式+Java大数) How Many Pieces of Land ?

题意: 一块圆形土地,在圆周上选n个点,然后两两连线,问把这块土地分成多少块? 分析: 首先紫书上的公式是错的,不过根据书上提供的思路很容易稍加修改得到正确答案! 然后推公式吧,这里用到平面图的欧拉公式,V - E + F = 2,其中V表示顶点个数,E表示边的个数,F表示面的块数. 减去最外面的无限大的面,所求ans = E - V + 1 假设n≥4,从圆周上的一个点出发枚举一条对角线,左边有i个点,右边有n-2-i个点,将左右两边的点两两相连,就在这条对角线上得到个交点.每个交点被重复计算

划分土地(how many pieces of land)

题目描述: 给一个椭圆,上面有n个点,两两连接这n个点,得到的线段能把椭圆分为几个区域? 思路: 首先想想,n个点在椭圆边缘,每两个点两两连接有\(C^2_n\)条线段,这些线段交于很多点,求这些线段最多把椭圆分成几个部分. 考虑到欧拉公式:在平面图中\(V-E+F=2\),\(V\)为顶点数,\(E\)是边数,\(F\)是面数.我们要求的是\(F\),只要求\(E\)与\(V\)就行了.那么怎么求\(V\)呢? 考虑每一个顶点,以这个顶点为基础,不断向其他点发出对角线,在对角线左边的点是\(i

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO