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即可(注意还要减去外面的“无限面”)。
不管是顶点还是边,计算时都要枚举一条从固定点出发(所以最后要乘以n)的对角线,
它的左边有i个点,右边有n-2-i个点。
左右点的连线在这条对角线上形成i(n-2-i)个交点,得到i(n-2-i)+1条线段。
每个交点被重复计算了4次,每条线段被重复计算了2次。

 

根据:

 

化简得:

 

代码:

 1 import java.io.*;
 2 import java.util.*;
 3 import java.math.*;
 4 
 5 public class Main {
 6     Scanner cin = new Scanner(new BufferedInputStream(System.in));
 7     final BigInteger c1 = new BigInteger("1");
 8     final BigInteger c2 = new BigInteger("2");
 9     final BigInteger c3 = new BigInteger("3");
10     final BigInteger c12 = new BigInteger("12");
11     
12     void MAIN() {
13         int T = cin.nextInt();
14         while(T --> 0) {
15             BigInteger n = cin.nextBigInteger();
16             BigInteger one = n.multiply(n.subtract(c1)).divide(c2);
17             BigInteger two = one.multiply(n.subtract(c2)).multiply(n.subtract(c3)).divide(c12);
18             System.out.println(one.add(two).add(c1));
19         }
20     }
21     
22     public static void main(String args[]) { new Main().MAIN(); }
23 }

 

转载于:https://www.cnblogs.com/hkxy125/p/9631777.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值