题意:一块圆形土地,在圆周上选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 的意思就是加上原来的 n 个顶点,E 加 2n的意思就是,

先加原来 n 个点相邻的边数,然后再加上这个椭圆被这个圆分成的n条边,最后就是在总面数再减去那一个“无限面”。这个公式不要用循环来算,要化简公式,最后结果还是挺简单的。

ans = n * (n-1) * (n-2) * (n-3)/24 + n * (n-3)/2 + n + 1。

代码如下:

import java.math.BigInteger;
import java.util.Scanner; public class Main { public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int T;
T = cin.nextInt();
for(int i = 0; i < T; ++i){
BigInteger n = cin.nextBigInteger();
BigInteger n1 = n.subtract(BigInteger.ONE);
BigInteger n2 = n1.subtract(BigInteger.ONE);
BigInteger n3 = n2.subtract(BigInteger.ONE); BigInteger a = n.multiply(n1).multiply(n2).multiply(n3).divide(BigInteger.valueOf(24));
BigInteger b = n.multiply(n3).divide(BigInteger.valueOf(2));
BigInteger ans = a.add(b).add(n).add(BigInteger.ONE);
System.out.println(ans);
}
} }

最新文章

  1. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
  2. C++预定义宏
  3. 如何使用JDBC链接数据库
  4. 入门:HTML表单与Java 后台交互(复选框提交)
  5. Lucene
  6. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】
  7. DDD学习笔记二
  8. 如何教你在NIPS会议上批量下载历年的pdf文档(另附04~14年NIPS论文下载链接)
  9. ansible api
  10. 编译安装httpd
  11. virtualbox 虚拟机网络设置
  12. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
  13. SQLServer通过链接服务器远程删除数据性能问题解决
  14. 车大棒浅谈jQuery源码(一)
  15. require.js疑惑
  16. python爬虫爬取人人车(二手车)、利用padas、matplotlib生成图表,将信息打成csv格式
  17. ant安装和验证
  18. Nginx服务器配置之location语法分析
  19. PAT1037:Magic Coupon
  20. python学习day21 面向对象(三)嵌套/特殊方法

热门文章

  1. pandas-数据分析
  2. bvlc_reference_caffenet.caffemodel
  3. Effective Java - [2. 创建与销毁对象]
  4. ios 使用自定义字体
  5. hdu5261单调队列
  6. Parallel Tests
  7. RecyclerView 可以与CollapsingToolbarLayout一起使用
  8. raise 与 raise ... from 的区别
  9. ubuntu连接kinect v2
  10. javascript ajax和jquery ajax