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能取的整数就是整数解。就得到答案。

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

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std; const long long INF = 0x3f3f3f3f3f3f3f;
int t;
long long xx1, yy1, xx2, yy2;
long long a, b, c; long long read(){
double t;
scanf("%lf", &t);
return (long long)(10 * (t + 0.05));
} long long gcd(long long a, long long b) {
if (!b) return a;
return gcd(b, a % b);
} long long exgcd(long long a, long long b, long long &x, long long &y) {
if (!b) {x = 1; y = 0; return a;}
long long d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
} void build() {
a = (yy2 - yy1) * 10;
b = (xx1 - xx2) * 10;
c = (yy2 - yy1) * xx1 + (xx1 - xx2) * yy1;
long long t = gcd(gcd(a, b), c);
a /= t; b /= t; c /= t;
} long long solve() {
long long ans = 0;
long long x, y;
long long d = exgcd(a, b, x, y);
long long up = INF, down = -INF;
if (xx1 > xx2) swap(xx1, xx2);
if (yy1 > yy2) swap(yy1, yy2);
if (c % d) return ans;
if (b / d > 0) {
down = max(down, (long long)ceil((xx1 * d * 1.0 / 10 - x * c * 1.0) / b));
up = min(up, (long long)floor((xx2 * d * 1.0 / 10 - x * c * 1.0) / b));
}
else if (b / d < 0) {
up = min(up, (long long)floor((xx1 * d * 1.0 / 10 - x * c * 1.0) / b));
down = max(down, (long long)ceil((xx2 * d * 1.0 / 10 - x * c * 1.0) / b));
}
else if (xx1 % 10) return ans;
if (a / d > 0) {
down = max(down, (long long)ceil((y * c * 1.0 - d * yy2 * 1.0 / 10) / a));
up = min(up, (long long)floor((y * c * 1.0 - d * yy1 * 1.0 / 10) / a));
}
else if (a / d < 0) {
up = min(up, (long long)floor((y * c * 1.0 - d * yy2 * 1.0 / 10) / a));
down = max(down, (long long)ceil((y * c * 1.0 - d * yy1 * 1.0 / 10) / a));
}
else if (yy1 % 10) return ans;
if (down <= up)
ans += up - down + 1;
return ans;
} int main() {
scanf("%d", &t);
while (t--) {
xx1 = read(); yy1 = read(); xx2 = read(); yy2 = read();
build();
printf("%lld\n", solve());
}
return 0;
}

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. linux命令:使用man, 导出man

    要查一个命令怎么使用,使用"man 命令", eg: man find, man ls; "info 命令"貌似也可以看, info find, info ls ...

  2. ASP.NET Core 中文文档

    ASP.NET Core 中文文档 翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先 ...

  3. 在纯C工程的main函数之前跑代码(手工找到程序入口点, 替换为我们自己的函数)

    在main函数之前跑代码的方法 方法: 手工找到程序入口点, 替换为我们自己的函数 写测试程序 // test.cpp : Defines the entry point for the consol ...

  4. 基于visual Studio2013解决C语言竞赛题之1085相邻之和素数

        题目 解决代码及点评 /************************************************************************/ /* ...

  5. EasyUI - Draggable 拖动控件

    效果: html代码: <div id="box" style="width: 400px; height: 200px; background-color: #f ...

  6. 关于Smartforms换页的

    smartforms中有系统变量SFSY-PAGE是总页码,SFSY-FORMPAGES是当前页,可以最后的窗体中做个判断 1.把窗体设置成最终窗体 2.新增一个命令,当前页等于最后一页才输出改内容, ...

  7. JSP的学习(6)——九大隐式对象及其out对象

    本篇将介绍JSP中的九大隐式对象,并重点介绍其中的out对象. 我们在之前的博客<JSP的学习(1)——基础知识与底层原理>一文中已经知道,JSP最终要被翻译和转换成Servlet,在转换 ...

  8. 积累的VC编程小技巧之编辑框

    1.如何让对话框中的编辑框接收对话框的消息 ////////////////////////////////////////////////// 如何让对话框中的CEdit控件类接收对话框的消息/// ...

  9. javascript实现图片无缝滚动(scrollLeft的使用方法介绍)

    <!DOCTYPE html > <html> <head> <meta http-equiv="Content-Type" conten ...

  10. CloseHandle(),TerminateThread(),ExitThread()的差别

    线程的handle用处: 线程的handle是指向"线程的内核对象"的,而不是指向线程本身.每一个内核对象仅仅是内核分配的一个内存块,而且仅仅能由内核訪问.该内存块是一种数据结构, ...