本题是极其裸的EXGCD
AX+BY+C=0
给你a b c 和x与y的区间范围,问你整数解有几组
作为EXGCD入门,题目比较简单 主要需要考虑区间范围的向上、向下取整,及正负符号的问题
*问题是这正负号判断考虑让我WA无数次* **我好菜阿**

> 补充:关于使用扩展欧几里德算法解决不定方程的办法
>对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。
>上面已经列出找一个整数解的方法,在找到p * a+q * b = Gcd(p, q)的一组解p0,q0后,p * a+q * b = Gcd(p, q)的其他整数解满足:
>p = p0 + b/Gcd(p, q) * t
>q = q0 – a/Gcd(p, q) * t(其中t为任意整数)
>至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(p, q)的每个解乘上 c/Gcd(p, q) 即可
>——摘自他人博客

/** @Date    : 2016-10-21-15.24

* @Author : Lweleth (SoungEarlf@gmail.com)

* @Link :

* @Version : $

*/

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <algorithm>

#include <utility>

#include <vector>

#include <map>

#include <set>

#include <math.h>

#include <string>

#include <stack>

#include <queue>

#define LL long long

#define MMF(x) memset((x),0,sizeof(x))

#define MMI(x) memset((x), INF, sizeof(x))

using namespace std;



const int INF = 0x3f3f3f3f;

const int N = 1e5+2000;





LL exgcd(LL a, LL b, LL &x, LL &y)

{

LL d = a;

if(b == 0)

{

x = 1;

y = 0;

}

else

{

d = exgcd(b, a % b, y, x);

y -= (a / b)*x;

}

return d;

}



int main()

{

int T;

int cnt = 0;

cin >> T;

while(T--)

{

LL a, b, c, x1, x2, y1, y2;

scanf("%lld%lld%lld", &a, &b, &c);

scanf("%lld%lld%lld%lld",&x1, &x2, &y1, &y2);

c = -c;

if(a < 0)

{

a = -a;

swap(x1, x2);

x1 = -x1;

x2 = -x2;

}

if(b < 0)

{

b = -b;

swap(y1, y2);

y1 = -y1;

y2 = -y2;

}

printf("Case %d: ", ++cnt);

LL x0 = 0 , y0 = 0;




LL g = exgcd(a, b, x0, y0);

if(g!=0 && c % g != 0)

{

printf("0\n");

continue;

}

if(a == 0 && b == 0)

{

if(!c)

printf("%lld\n", (x2 - x1 + 1) * (y2 - y1 + 1));

else printf("0\n");

continue;



}

if(a == 0)

{

if(c / b >= y1 && c/b <= y2)

printf("%lld\n", x2 - x1 + 1);

else printf("0\n");

continue;

}

if(b == 0)

{

if(c / a >= x1 && c / a <= x2)

printf("%lld\n", y2 - y1 + 1);

else printf("0\n");

continue;



}



x0 = x0 * c / g;

y0 = y0 * c / g;

a /= g;

b /= g;

LL l = ceil((double)(x1 - x0)/(double)(b));

LL r = floor((double)(x2 - x0)/(double)(b));

LL w = ceil((double)(y0 - y2)/(double)(a));

LL e = floor((double)(y0 - y1)/(double)(a));

LL q = max(l, w);

LL p = min(r, e);

if(p < q)

printf("0\n");

else printf("%lld\n", p - q + 1);

}

return 0;

}

LightOJ 1306 - Solutions to an Equation 裸EXGCD的更多相关文章

  1. lightoj 1306 - Solutions to an Equation 扩展的欧几里得

    思路:看题就知道用扩展的欧几里得算法做!!! 首先我们可以求出ax+by=gcd(a,b)=g的一个组解(x0,y0).而要使ax+by=c有解,必须有c%g==0. 继而可以得到ax+by=c的一个 ...

  2. [lightoj P1306] Solutions to an Equation

    [lightoj P1306] Solutions to an Equation You have to find the number of solutions of the following e ...

  3. 1306 - Solutions to an Equation

    1306 - Solutions to an Equation    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Lim ...

  4. Solutions to an Equation LightOJ - 1306

    Solutions to an Equation LightOJ - 1306 一个基础的扩展欧几里得算法的应用. 解方程ax+by=c时,基本就是先记录下a和b的符号fla和flb(a为正则fla为 ...

  5. Jordan Lecture Note-6: The Solutions of Nonlinear Equation.

    The Solutions of Nonlinear Equation 本文主要介绍几种用于解非线性方程$f(x)=0$的一些方法. (1) Bisection Method. 算法: step 1: ...

  6. (light oj 1306) Solutions to an Equation 扩展欧几里得算法

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...

  7. [ACM_数学] Counting Solutions to an Integral Equation (x+2y+2z=n 组合种类)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27938#problem/E 题目大意:Given, n, count the numbe ...

  8. [LeetCode] Solve the Equation 解方程

    Solve a given equation and return the value of x in the form of string "x=#value". The equ ...

  9. [Swift]LeetCode640. 求解方程 | Solve the Equation

    Solve a given equation and return the value of x in the form of string "x=#value". The equ ...

随机推荐

  1. 20145214 《Java程序设计》第8周学习总结

    20145214 <Java程序设计>第8周学习总结 教材学习内容总结 日志API 使用日志的起点是Logger类,Logger类的构造函数标示为protected,不是java.util ...

  2. TCP系列15—重传—5、Linux中RTO的计算

    之前我们介绍的都是协议中给出的RTO计算方法,下面我们看一下linux实现中RTO的计算方法.在linux中维护了srtt.mdev.mdev_max.rttvar.rtt_seq几个状态变量用来计算 ...

  3. Expected Conditions的常用函数

    Expected Conditions的使用场景有两种  1.直接在断言中使用  2.与WebDriverWait配合使用,动态等待页面上元素出现或者消失 1. title_is: 判断当前页面的ti ...

  4. 常见设备在linux中的文件名

    设备 linux中的文件名 IDE硬盘 /dev/hd[a-d] SATA/USB/SCSI/SAS /dev/sd[a-p] 软盘 /dev/fd[0-1] 打印机 25针:/dev/lp[0-2] ...

  5. try catch finally 与continue的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. dwarf是怎样处理的栈帧?

    dwarf是如何处理的栈帧呢? 首先看下非dwarf的情况是如何处理栈帧的: 1 3623804982590 0x3e90 [0xb0]: PERF_RECORD_SAMPLE(IP, 0x1): 1 ...

  7. set(gcf,'DoubleBuffer','on')

    设置的目的是为了防止在不断循环画动画的时候会产生闪烁的现象,而这样便不会了.在动画的制作比较常用.

  8. bzoj4332[JSOI2012]分零食

    一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存 ...

  9. BZOJ4241 历史研究(莫队)

    如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...

  10. hdu 1068 Girls and Boys (二分匹配)

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...