题面(本人翻译)

A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integers t - 1, t, t + 1 and thatits area is an integer. Now, for given n you need to find a Heron’s triangle associated with the smallest t bigger

than or equal to n.

一个三角形是 Heron 三角形仅当它的三边长是连续的正整数 t - 1, t, t + 1, 并且面积是正整数。现在,给你一个整数 N ,求大于等于 N 的最小的合法的 t (Heron 三角形的第二小的边)。

Input

The input contains multiple test cases. The first line of a multiple input is an integer T (1 ≤ T ≤ 30000) followedby T lines. Each line contains an integer N (1 ≤ N ≤ 10^30).

一个正整数 T 表示数据组数,1 ≤ T ≤ 30000。接下来 T 行每行一个整数 N,1 ≤ N ≤ 10^30。

Output

For each test case, output the smallest t in a line. If the Heron’s triangle required does not exist, output -1.

每个数据输出一行,即题意中的最小的 t ,如果没有满足要求的 Heron 三角形,输出 -1。

Sample Input

  1. 4
  2. 1
  3. 2
  4. 3
  5. 4

Sample Output

  1. 4
  2. 4
  3. 4
  4. 4

题解

我们可以用海伦公式表示面积

我们设 x = t/2,y = 2S/t,那么

这是pell方程的形式,所以先手算出最小的解 x=2,y=3,然后我们用pell方程的递推式:

我们会发现X增长得很快,到第52个就超过十的三十次方了,因此我们可以先打个表

  1. X[1] = 4;
  2. X[2] = 14;
  3. X[3] = 52;
  4. X[4] = 194;
  5. X[5] = 724;
  6. X[6] = 2702;
  7. X[7] = 10084;
  8. X[8] = 37634;
  9. X[9] = 140452;
  10. X[10] = 524174;
  11. X[11] = 1956244;
  12. X[12] = 7300802;
  13. X[13] = 27246964;
  14. X[14] = 101687054;
  15. X[15] = 379501252;
  16. X[16] = 1416317954;
  17. X[17] = 5285770564;
  18. X[18] = 19726764302;
  19. X[19] = 73621286644;
  20. X[20] = 274758382274;
  21. X[21] = 1025412242452;
  22. X[22] = 3826890587534;
  23. X[23] = 14282150107684;
  24. X[24] = 53301709843202;
  25. X[25] = 198924689265124;
  26. X[26] = 742397047217294;
  27. X[27] = 2770663499604052;
  28. X[28] = 10340256951198914;
  29. X[29] = 38590364305191604;
  30. X[30] = 144021200269567502;
  31. X[31] = 537494436773078404;
  32. X[32] = 2005956546822746114;
  33. X[33] = 7486331750517906052;
  34. X[34] = 27939370455248878094;
  35. X[35] = 104271150070477606324;
  36. X[36] = 389145229826661547202;
  37. X[37] = 1452309769236168582484;
  38. X[38] = 5420093847118012782734;
  39. X[39] = 20228065619235882548452;
  40. X[40] = 75492168629825517411074;
  41. X[41] = 281740608900066187095844;
  42. X[42] = 1051470266970439230972302;
  43. X[43] = 3924140458981690736793364;
  44. X[44] = 14645091568956323716201154;
  45. X[45] = 54656225816843604128011252;
  46. X[46] = 203979811698418092795843854;
  47. X[47] = 761263020976828767055364164;
  48. X[48] = 2841072272208896975425612802;
  49. X[49] = 10603026067858759134647087044;
  50. X[50] = 39571031999226139563162735374;
  51. X[51] = 147681101929045799118003854452;
  52. X[52] = 551153375716957056908852682434;
  53. X[53] = 2056932400938782428517406875284; // 此处就超过 10^30 了

然后就二分判断就过了。

这题根本就不存在 -1。

CODE

zxy tql %%%%%%

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<vector>
  4. #include<stack>
  5. #include<queue>
  6. #include<algorithm>
  7. #include<map>
  8. #include<cmath>
  9. #include<bitset>
  10. #include<ctime>
  11. #include<iostream>
  12. #define MAXN 2005
  13. #define LL long long
  14. #define ULL unsigned LL
  15. #define rg register
  16. #define lowbit(x) (-(x) & (x))
  17. #define ENDL putchar('\n')
  18. #define DB double
  19. //#define bs bitset<1005>
  20. //#pragma GCC optimize(2)
  21. //#pragma G++ optimize(3)
  22. //#define int LL
  23. using namespace std;
  24. char char_read_before = 1;
  25. inline int read() {
  26. int f = 1,x = 0;char s = char_read_before;
  27. while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
  28. while(s >= '0' && s <= '9') {x = x * 10 - '0' + s;s = getchar();}
  29. char_read_before = s; return x * f;
  30. }
  31. inline char readchar() {
  32. char s = char_read_before;
  33. while(s == 1 || s == ' ' || s == '\n') s = getchar();
  34. char_read_before = 1; return s;
  35. }
  36. LL zxy = 100000000;
  37. int n,m,i,j,s,o,k;
  38. DB bg;inline DB Time() {return DB(clock() - bg) / CLOCKS_PER_SEC;}
  39. struct Num{
  40. LL s[4];
  41. Num(){s[0]=s[1]=s[2]=s[3]=0;}
  42. Num(int b) {s[0] = b;s[1] = s[2] = s[3] = 0;}
  43. Num operator = (int b) {
  44. s[0] = b;
  45. s[1] = s[2] = s[3] = 0;
  46. return *this;
  47. }
  48. void tl() {
  49. s[0] *= 10;
  50. s[1] = s[1] * 10 + s[0] / zxy;
  51. s[2] = s[2] * 10 + s[1] / zxy;
  52. s[3] = s[3] * 10 + s[2] / zxy;
  53. s[0] %= zxy;
  54. s[1] %= zxy;
  55. s[2] %= zxy;
  56. }
  57. };
  58. inline Num operator *(Num a,Num b) {
  59. Num c;
  60. for(int i = 0;i < 4;i ++) {
  61. LL m = 0;
  62. for(int j = 0;i+j < 4;j ++) {
  63. c.s[i+j] += a.s[i] *1ll* b.s[j] + m;
  64. m = c.s[i+j] / zxy;
  65. c.s[i+j] %= zxy;
  66. }
  67. }return c;
  68. }
  69. inline Num operator +(Num a,Num b) {
  70. LL m = 0;
  71. for(int i=0;i<4;i++) {
  72. a.s[i] += b.s[i] + m;
  73. m = a.s[i] / zxy;
  74. a.s[i] %= zxy;
  75. }return a;
  76. }
  77. inline bool operator < (Num a,Num b) {
  78. if(a.s[3] != b.s[3]) return a.s[3] < b.s[3];
  79. if(a.s[2] != b.s[2]) return a.s[2] < b.s[2];
  80. if(a.s[1] != b.s[1]) return a.s[1] < b.s[1];
  81. return a.s[0] < b.s[0];
  82. }
  83. inline bool operator >= (Num a,Num b) {return !(a < b);}
  84. inline void print(Num a) {
  85. int le = 0;
  86. if(a.s[3]) le = 3;
  87. else if(a.s[2]) le = 2;
  88. else if(a.s[1]) le = 1;
  89. printf("%d",a.s[le]);
  90. while(le --) printf("%08d",a.s[le]);
  91. return ;
  92. }
  93. inline Num readn() {
  94. int f = 1;Num x(0);char s = char_read_before;
  95. while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
  96. while(s >= '0' && s <= '9') {x.tl();x = x + Num(s - '0');s = getchar();}
  97. char_read_before = s; return x;
  98. }
  99. struct mat{
  100. int n,m;
  101. Num s[3][3];
  102. mat(){n=m=0;s[1][1]=s[1][2]=s[2][1]=s[2][2]=Num();}
  103. }A,B;
  104. inline mat operator * (mat a,mat b) {
  105. mat c; c.n = a.n;c.m = b.m;
  106. for(int i=1;i<=c.n;i++)
  107. for(int k=1;k<=a.m;k++)
  108. for(int j=1;j<=c.m;j++)
  109. c.s[i][j] = c.s[i][j] + a.s[i][k] * b.s[k][j];
  110. return c;
  111. }
  112. Num as[100];
  113. signed main() {
  114. bg = clock();
  115. A.n = 1;
  116. A.m = B.n = B.m = 2;
  117. A.s[1][1] = 2;
  118. A.s[1][2] = 3;
  119. B.s[1][1] = 2;
  120. B.s[2][1] = 1;
  121. B.s[1][2] = 3;
  122. B.s[2][2] = 2;
  123. for(int i = 0;i <= 52;i ++) {
  124. as[i] = A.s[1][1] * Num(2);
  125. A = A * B;
  126. }
  127. int T = read();
  128. while(T --) {
  129. Num nn = readn();
  130. int l = 0,r = 52,mid;
  131. while(l < r) {
  132. mid = l + r >> 1;
  133. if(as[mid] >= nn) r = mid;
  134. else l = mid+1;
  135. }
  136. print(as[l]);
  137. ENDL;
  138. }
  139. return 0;
  140. }

HDU 6222 Heron and His Triangle (pell 方程)的更多相关文章

  1. Heron and His Triangle HDU - 6222(pell 大数)

    ---恢复内容开始--- Heron and His Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/2 ...

  2. HDU 2281 Square Number Pell方程

    http://acm.hdu.edu.cn/showproblem.php?pid=2281 又是一道Pell方程 化简构造以后的Pell方程为 求出其前15个解,但这些解不一定满足等式,判断后只有5 ...

  3. Pell方程及其一般形式

    一.Pell方程 形如x^2-dy^2=1的不定方程叫做Pell方程,其中d为正整数,则易得当d是完全平方数的时候这方程无正整数解,所以下面讨论d不是完全平方数的情况. 设Pell方程的最小正整数解为 ...

  4. hdu 3304 Interesting Yang Yui Triangle

    hdu 3304 Interesting Yang Yui Triangle 题意: 给出P,N,问第N行的斐波那契数模P不等于0的有多少个? 限制: P < 1000,N <= 10^9 ...

  5. hdu3293(pell方程+快速幂)

    裸的pell方程. 然后加个快速幂. No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: ...

  6. POJ 1320 Street Numbers Pell方程

    http://poj.org/problem?id=1320 题意很简单,有序列 1,2,3...(a-1),a,(a+1)...b  要使以a为分界的 前缀和 和 后缀和 相等 求a,b 因为序列很 ...

  7. POJ 2427 Smith's Problem Pell方程

    题目链接 :  http://poj.org/problem?id=2427 PELL方程几个学习的网址: http://mathworld.wolfram.com/PellEquation.html ...

  8. Heron and His Triangle HDU - 6222

    题目链接:https://vjudge.net/problem/HDU-6222 思路:打表找规律. 然后因为数据范围较大可以考虑用字符串模拟,或者__int128要注意用一个快读快输模板. 1 #i ...

  9. Heron and His Triangle 2017 沈阳区域赛

    A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integer ...

随机推荐

  1. Java实用类-Enum(枚举)

    1. 历史 ​ 在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代(例如,public static final String male ).JKD1.5之后使用 Java 枚举类型 e ...

  2. BUUCTF-佛系少年

    佛系少年 这题我感觉超扯,不知道当时环境是不是断网的,断网咋解密的出来.. 下载后有个压缩包,带加密的,首先16进制看看是否是真加密 这里可以看到,压缩包数据区这里都是未加密的方式 但是到了压缩包目录 ...

  3. jenkins部署docker

    1. 先在jenkins上配置拉取代码部分,需要在git上找到项目位置,直接复制url即可 http://192.168.0.161:3000/IT-Insurance/Back.Test-Walle ...

  4. Mybatis中@select注解联合查询

    前言 在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@ ...

  5. iOS OC纯代码企业级项目实战之我的云音乐(持续更新))

    简介 这是一个使用OC语言,从0使用纯代码方式开发一个iOS平台,接近企业级商业级的项目(我的云音乐),课程包含了基础内容,高级内容,项目封装,项目重构等知识:主要是讲解如何使用系统功能,流行的第三方 ...

  6. NC14326 Rails

    NC14326 Rails 题目 题目描述 There is a famous railway station in PopPush City. Country there is incredibly ...

  7. PTA(BasicLevel)-1031 查验身份证

    一.问题定义 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下:首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,1 ...

  8. github package的使用教程

    一.写在前面 上一次,笔者向大家介绍了把gitlab仓库作为npm私包的使用方法,具体的详见我的博文地址https://www.cnblogs.com/cnroadbridge/p/16406476. ...

  9. Git Rebase操作

    概括 rebase翻译过来为"变基",可以理解为改变基础,它可以用于分支合并和修改提交记录. 合并分支的区别 我们知道merge操作也可以用于分支合并,但是其和rebase操作有着 ...

  10. HDFS、Yarn、Hive…MRS中使用Ranger实现权限管理全栈式实践

    摘要:Ranger为组件提供基于PBAC的鉴权插件,供组件服务端运行,目前支持Ranger鉴权的组件有HDFS.Yarn.Hive.HBase.Kafka.Storm和Spark2x,后续会支持更多组 ...