题意:

给出一个\(n(0 \leq n \leq 10^{12})\),问\(n\)个\(M\)形的折线最多可以把平面分成几部分。

分析:

很容易猜出来这种公式一定的关于\(n\)的一个二次多项式。

不妨设\(f(n)=an^2+bn+c\)。

结合样例我们可以列出\(3\)个方程:

\(f(0)=1,f(1)=2,f(2)=19\)

解出三个系数\(a,b,c\),然后用高精度做即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. const LL MOD = 1000000000;
  7. struct Big
  8. {
  9. LL a[5];
  10. Big() { memset(a, 0, sizeof(a)); }
  11. Big(LL x) { memset(a, 0, sizeof(a)); a[1] = x / MOD; a[0] = x % MOD; }
  12. void read() {
  13. memset(a, 0, sizeof(a));
  14. LL x; scanf("%lld", &x);
  15. a[0] = x % MOD; a[1] = x / MOD;
  16. }
  17. Big operator + (const Big& t) const {
  18. Big ans;
  19. for(int i = 0; i < 5; i++) ans.a[i] = a[i];
  20. for(int i = 0; i < 5; i++) {
  21. ans.a[i] += t.a[i];
  22. int j = i;
  23. while(ans.a[j] >= MOD) {
  24. ans.a[j + 1] += ans.a[j] / MOD;
  25. ans.a[j++] %= MOD;
  26. }
  27. }
  28. return ans;
  29. }
  30. Big operator * (const Big& t) const {
  31. Big ans;
  32. for(int i = 0; i < 5; i++) {
  33. for(int j = 0; j < 5; j++) if(i + j < 5) {
  34. ans.a[i + j] += a[j] * t.a[i];
  35. int k = i + j;
  36. while(ans.a[k] >= MOD) {
  37. ans.a[k + 1] += ans.a[k] / MOD;
  38. ans.a[k++] %= MOD;
  39. }
  40. }
  41. }
  42. return ans;
  43. }
  44. Big operator - (const Big& t) const {
  45. Big ans;
  46. for(int i = 0; i < 5; i++) ans.a[i] = a[i];
  47. for(int i = 0; i < 5; i++) {
  48. int j = i + 1;
  49. if(ans.a[i] < t.a[i]) {
  50. while(!ans.a[j]) j++;
  51. ans.a[j]--;
  52. for(int k = j - 1; k > i; k--) ans.a[k] += MOD - 1;
  53. ans.a[i] += MOD;
  54. }
  55. ans.a[i] -= t.a[i];
  56. }
  57. return ans;
  58. }
  59. void output() {
  60. int i = 0;
  61. for(i = 4; i; i--) if(a[i]) break;
  62. printf("%lld", a[i]);
  63. for(int j = i - 1; j >= 0; j--) printf("%09lld", a[j]);
  64. printf("\n");
  65. }
  66. };
  67. int main()
  68. {
  69. int T; scanf("%d", &T);
  70. for(int kase = 1; kase <= T; kase++) {
  71. printf("Case #%d: ", kase);
  72. Big x; x.read();
  73. Big ans(1);
  74. ans = ans + (Big(8) * x * x);
  75. ans = ans - (Big(7) * x);
  76. ans.output();
  77. }
  78. return 0;
  79. }

HDU 5047 Sawtooth 高精度的更多相关文章

  1. HDU 5047 Sawtooth(大数优化+递推公式)

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 题目大意: 给n条样子像“m”的折线,求它们能把二维平面分成的面最多是多少. 解题思路: 我们发现直线1条 ...

  2. HDU 5047 Sawtooth(大数模拟)上海赛区网赛1006

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 解题报告:问一个“M”型可以把一个矩形的平面最多分割成多少块. 输入是有n个“M",现 ...

  3. HDU 5047 Sawtooth 找规律+拆分乘

      Sawtooth Think about a plane: ● One straight line can divide a plane into two regions. ● Two lines ...

  4. 2014 网选 上海赛区 hdu 5047 Sawtooth

    题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个 ...

  5. HDU 5047

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 直到看到题解,我才知道这道题考的是什么 首先交点数是Σ(16*i),区域区分的公式是 边数+点数+1=分成 ...

  6. Hdu 5568 sequence2 高精度 dp

    sequence2 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=556 ...

  7. hdu 1042 N!(高精度乘法 + 缩进)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...

  8. hdu 5047 大数找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...

  9. HDU 4704 Sum (高精度+快速幂+费马小定理+二项式定理)

    Sum Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status  ...

随机推荐

  1. ECharts3.0介绍、入门

    ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,S ...

  2. sql常用操作(二)数据约束

    1.1什么是数据约束: 对用户操作表的数据进行约束 1.2 默认值 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的. 2)对默认值字段可以 ...

  3. pixhawk 固件Firmware内执行make px4fmu-v2_default 编译报错解决办法

    执行下列指令报错 make px4fmu-v2_default /bin/sh: 1: Tools/check_cmake.sh: Permission denied Makefile:44: Not ...

  4. 3285 转圈游戏 2013年NOIP全国联赛提高组

    3285 转圈游戏 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description n 个小伙伴 ...

  5. 使用SharePreferences存取数据(慕课笔记 )

    0.视频地址:http://www.imooc.com/video/3265 1.使用SharePreferences存取数据: public class MainActivity extends A ...

  6. C语言的time函数和localtime函数

    1.获取当前时间,并获取当前时间(即系统时间)距离1970年1月1日的时间间隔,以秒为单位. 2.获取指定时间距离1970年1月1日的时间间隔,以秒为单位.

  7. android 内存泄露测试

    Android 程序由java语言编写,android的内存管理与java相似,通过new为对象分配内存,所有对象在java堆内分配空间,对象回收有个垃圾回收器来完成.GC就是垃圾收集的意思(Gaba ...

  8. python基础教程总结15——3 XML构建网址

    要求: 网址用一个XML文件描述,其中包括独立网页和目录的信息: 程序能创建所需的目录和网页: 可以改变网址的设计,并且以新的设计为基础重新生成所有网页 概念: 网站:不用存储有关网站本身的任何信息, ...

  9. [torch] torch.contiguous

    torch.contiguous 作用 连续存储,因为view的操作要求的是连续的内容. 详细 考虑下面的操作,transpose操作只是改变了stride,而实际数组存储的内容并没有得到任何改变,即 ...

  10. 使用Selennium实现短信轰炸机

    前言 可以用来轰炸一下骗子,但最好不要乱用.本来初学Python,仅当学习. selenium和ChromeDriver的安装与配置 可参考这篇博客,这里不再赘述. 程序实现 短信轰炸机的原理是利用一 ...