UVA 11768 - Lattice Point or Not

option=com_onlinejudge&Itemid=8&page=show_problem&category=516&problem=2868&mosmsg=Submission+received+with+ID+13823461" target="_blank" style="">题目链接

题意:给定两个点,构成一条线段。这些点都是十分位形式的,求落在这个直线上的正数点。

思路:先把直线表达成a x + b y = c的形式,a,b, c都化为整数表示。然后利用扩展gcd求出x和y的通解,然后已知min(x1, x2) <= x <= max(x1, x2), min(y1, y2) <= y <= max(y1, y2)。这样一来就能够求出通解中t的范围,t能取的整数就是整数解。就得到答案。

值得注意的是。直线为平行坐标系的情况。要特殊推断一下

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const long long INF = 0x3f3f3f3f3f3f3f;
  8. int t;
  9. long long xx1, yy1, xx2, yy2;
  10. long long a, b, c;
  11.  
  12. long long read(){
  13. double t;
  14. scanf("%lf", &t);
  15. return (long long)(10 * (t + 0.05));
  16. }
  17.  
  18. long long gcd(long long a, long long b) {
  19. if (!b) return a;
  20. return gcd(b, a % b);
  21. }
  22.  
  23. long long exgcd(long long a, long long b, long long &x, long long &y) {
  24. if (!b) {x = 1; y = 0; return a;}
  25. long long d = exgcd(b, a % b, y, x);
  26. y -= a / b * x;
  27. return d;
  28. }
  29.  
  30. void build() {
  31. a = (yy2 - yy1) * 10;
  32. b = (xx1 - xx2) * 10;
  33. c = (yy2 - yy1) * xx1 + (xx1 - xx2) * yy1;
  34. long long t = gcd(gcd(a, b), c);
  35. a /= t; b /= t; c /= t;
  36. }
  37.  
  38. long long solve() {
  39. long long ans = 0;
  40. long long x, y;
  41. long long d = exgcd(a, b, x, y);
  42. long long up = INF, down = -INF;
  43. if (xx1 > xx2) swap(xx1, xx2);
  44. if (yy1 > yy2) swap(yy1, yy2);
  45. if (c % d) return ans;
  46. if (b / d > 0) {
  47. down = max(down, (long long)ceil((xx1 * d * 1.0 / 10 - x * c * 1.0) / b));
  48. up = min(up, (long long)floor((xx2 * d * 1.0 / 10 - x * c * 1.0) / b));
  49. }
  50. else if (b / d < 0) {
  51. up = min(up, (long long)floor((xx1 * d * 1.0 / 10 - x * c * 1.0) / b));
  52. down = max(down, (long long)ceil((xx2 * d * 1.0 / 10 - x * c * 1.0) / b));
  53. }
  54. else if (xx1 % 10) return ans;
  55. if (a / d > 0) {
  56. down = max(down, (long long)ceil((y * c * 1.0 - d * yy2 * 1.0 / 10) / a));
  57. up = min(up, (long long)floor((y * c * 1.0 - d * yy1 * 1.0 / 10) / a));
  58. }
  59. else if (a / d < 0) {
  60. up = min(up, (long long)floor((y * c * 1.0 - d * yy2 * 1.0 / 10) / a));
  61. down = max(down, (long long)ceil((y * c * 1.0 - d * yy1 * 1.0 / 10) / a));
  62. }
  63. else if (yy1 % 10) return ans;
  64. if (down <= up)
  65. ans += up - down + 1;
  66. return ans;
  67. }
  68.  
  69. int main() {
  70. scanf("%d", &t);
  71. while (t--) {
  72. xx1 = read(); yy1 = read(); xx2 = read(); yy2 = read();
  73. build();
  74. printf("%lld\n", solve());
  75. }
  76. return 0;
  77. }

UVA 11768 - Lattice Point or Not(数论)的更多相关文章

  1. UVA 11768 Lattice Point or Not(扩展欧几里德)

    将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...

  2. UVA 11768 - Lattice Point or Not

    首先本题需要用到扩展欧几里得算法…… 关于exgcd算法的一点简略证明: 那么,对于函数exgcd(a,b)=(d,x,y),其中d满足d=gcd(a,b); (x,y)满足ax+by=d; 则exg ...

  3. UVA - 11768 Lattice Point or Not (扩展欧几里得)

    求一条线段上有多少个整点. 是道扩欧基础题,列出两点式方程,然后分四种情况讨论即可.但细节处理较多很容易写挫(某zzWA了十几发才过掉的). 由于数据精度较小,浮点数比较没有用eps,直接==比较了. ...

  4. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  5. Lattice Point or Not UVA - 11768(拓展欧几里得)

    原文地址:https://www.cnblogs.com/zyb993963526/p/6783532.html 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB ...

  6. UVa 106 - Fermat vs Pythagoras(数论题目)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  7. UVA 10831 - Gerg&#39;s Cake(数论)

    UVA 10831 - Gerg's Cake 题目链接 题意:说白了就是给定a, p.问有没有存在x^2 % p = a的解 思路:求出勒让德标记.推断假设大于等于0,就是有解,小于0无解 代码: ...

  8. UVA 12103 - Leonardo&#39;s Notebook(数论置换群)

    UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...

  9. UVa 1363 - Joseph's Problem(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. webstorm与phpstorm主题配置

    原创. 更换webstorm的主题的,照着网上的教程试了好多次都发现不行,而且我之前有个同学也是这样的问题,找不到相关的colors文件夹,所以在网上教程的基础上对于更改主题做了细微的修改. 1.下载 ...

  2. 强化一下开源库:Synopse

    http://synopse.info/fossil/wiki/Synopse+OpenSource 有空要研究一下,只有写在这里,才会时时刻刻提醒自己.

  3. ANTLR4权威參考手冊(一)

    写在前面的话: 此文档是对伟大的Terence Parr的著作<the definitive antlr4 reference>的翻译本.致敬!欢迎转载,请注明原地址,请尊重劳动成果.翻译 ...

  4. Android 最火高速开发框架AndroidAnnotations使用具体解释

    Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤,Android 最火高速开发框架AndroidAnnotations简介文章中的简介, ...

  5. faith的23堂课:培养良好的工作方法与做事风格

    目标:通过每天一点的学习和实践,逐步形成好的做事风格和工作生活习惯. 方式:每天教一点,实践一点. 第一课 计划与总结,工作日志,戴明环 第二课 目的性:搞清楚,你每个行为的目的 第三课 目标管理,调 ...

  6. list view Item 里面有ImageButton

    list view Item 里面有ImageButton listview 的item中有ImageButton, 或者 Button. 目的: ImageButton 和 Button的click ...

  7. POJ2031Building a Space Station (最小生成树之prim)

    Problem Description You are a member of the space station engineering team, and are assigned a task ...

  8. 28.uva 10891 Game of Sum 记忆化dp

    这题和上次的通化邀请赛的那题一样,而且还是简化版本... 那题的题解      请戳这里 ... #include<cstdio> #include<algorithm> #i ...

  9. Delphi与Vista提供的UAC控制(1-代表资源编号,24-资源类型为RTMAINIFEST,最后用brcc32编译成资源文件)

    Vista提供的UAC机制,是Vista的新增功能之一.它的主要目的是防止对于操作系统本身的恶意修 改.如果想对于Vista的 系统设置进行改动,必须通过UAC的验 证才能够进行.通过这样的手段,大大 ...

  10. windows下eclipse跑junit报错:CreateProcess error=206

    from:http://isuifengfei.iteye.com/blog/1684262 windows下,eclipse中运行junit出现错误提示: Exception occurred ex ...