UVA 11768 - Lattice Point or Not(数论)
UVA 11768 - Lattice Point or Not
题意:给定两个点,构成一条线段。这些点都是十分位形式的,求落在这个直线上的正数点。
思路:先把直线表达成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(数论)的更多相关文章
- UVA 11768 Lattice Point or Not(扩展欧几里德)
将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...
- UVA 11768 - Lattice Point or Not
首先本题需要用到扩展欧几里得算法…… 关于exgcd算法的一点简略证明: 那么,对于函数exgcd(a,b)=(d,x,y),其中d满足d=gcd(a,b); (x,y)满足ax+by=d; 则exg ...
- UVA - 11768 Lattice Point or Not (扩展欧几里得)
求一条线段上有多少个整点. 是道扩欧基础题,列出两点式方程,然后分四种情况讨论即可.但细节处理较多很容易写挫(某zzWA了十几发才过掉的). 由于数据精度较小,浮点数比较没有用eps,直接==比较了. ...
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...
- Lattice Point or Not UVA - 11768(拓展欧几里得)
原文地址:https://www.cnblogs.com/zyb993963526/p/6783532.html 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB ...
- UVa 106 - Fermat vs Pythagoras(数论题目)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- UVA 10831 - Gerg's Cake(数论)
UVA 10831 - Gerg's Cake 题目链接 题意:说白了就是给定a, p.问有没有存在x^2 % p = a的解 思路:求出勒让德标记.推断假设大于等于0,就是有解,小于0无解 代码: ...
- UVA 12103 - Leonardo's Notebook(数论置换群)
UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...
- UVa 1363 - Joseph's Problem(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- google2013校园招聘笔试题(全国)
google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...
- 南京三星面试准备3--数组&基础数据结构
1.用递归颠倒一个栈. void PushToBottom(stack<int> &mystack,int num) { if(mystack.size()==0) { mysta ...
- 日本IT工作有感
不知不觉,在日本关西已经呆了快一个月了. 除了饮食有点不是非常习惯.其他感觉都还好. 日本这边的文化还是非常偏向project师的,project师的社会地位非常高,公司里面也没有国内所谓35岁的焦虑 ...
- Swift - 多线程实现方式(1) - NSThread
1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...
- C++学习之路—继承与派生(二):派生类的构造函数与析构函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...
- Servlet过滤器——异常捕获过滤器
1.概述 介绍如何实现异常捕获过滤器. 2.技术要点 本实例主要是在过滤器Filter的doFilter()方法中,对执行过滤器链的chain的doFilter()语句处添加try…catch异常捕获 ...
- 每日一帖示例程序(使用TWebBrowser基于HTML做)
最近在程序中增加了每日一帖的功能,搜索一下网站的程序,发现大部分是用Memo实现,而我用的是TWebBrowser基于HTML做,故帖出来共享一下. PAS源码: unit Unit1; interf ...
- 最完整的历史记录hadoop
课程主要涉及Hadoop Sqoop.Flume.Avro重要子项目的技术实战 课程针对人群 1.本课程适合于有一定java基础知识.对数据库和sql语句有一定了解,熟练使用linux系统的技术人员, ...
- Swift - AnyObject与Any的区别
1,AnyObject :代表任何class类型的对象实例. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Man{ } class Woman{ ...
- 屏幕对象的F1/F4输入帮助功能
1.HELP-REQUST[FOR{LOW|HIGH}]字段的F1帮助 当选择SAP屏幕功能的制定字段按F1键时可以调关注用自定义的程序或者系统帮助文件,该功能通常称为F1帮助. TYPES:syst ...