• UVA 11768


    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
    ", solve());
     	}
    	return 0;
    }


  • 相关阅读:
    css命名规范
    CSS3:box-sizing 怪异盒模型
    CSS3: box-shadow 阴影
    Spring boot分层和基本概念
    Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
    Spring boot基础:配置文件配置变量、多环境的配置
    IDEA是如何导入项目的,及启动导入项目遇到的问题:无法加载主类的一连串问题
    创建spring boot项目启动报错遇到的问题
    详解Spring Boot集成MyBatis的开发流程
    spring boot常用注解使用小结
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5164221.html
Copyright © 2020-2023  润新知