[lightoj P1306] Solutions to an Equation

You have to find the number of solutions of the following equation:

Ax + By + C = 0

Where A, B, C, x, y are integers and x1 ≤ x ≤ x2 and y1 ≤ y ≤ y2.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case starts with a line containing seven integers A, B, C, x1, x2, y1, y2 (x1 ≤ x2, y1 ≤ y2). The value of each integer will lie in the range [-108, 108].

Output

For each case, print the case number and the total number of solutions.

Sample Input

5

1 1 -5 -5 10 2 4

-10 -8 80 -100 100 -90 90

2 3 -4 1 7 0 8

-2 -3 6 -2 5 -10 5

1 8 -32 0 0 1 10

Sample Output

Case 1: 3

Case 2: 37

Case 3: 1

Case 4: 2

Case 5: 1

毒瘤题。。。

首先肯定要用到exgcd。。都快忘了。

再推一下——

Ax0+By0=gcd(A,B)

=  Bx+(A%B)y=gcd(B,A%B)

=  Bx+(A-(A/B)*B)y

=  Ay+B(x-(A/B)y)

则 x0=y,y0=(x-(A/B)y)。

好,推好式子再回到题目。

为了省去一些复杂的分类讨论,我们把A,B都搞成非负整数,同事区间范围也要改动。

然后判断几个特殊情况:

A==0&&B==0——>ans=(rx-lx+1)*(ry-ly+1)*(C==0)

A==0——>ans=(rx-lx+1)*jug(C/B in [ly..ry])*(C%B==0)

B==0——>ans=(ry-ly+1)*jug(C/A in [lx..rx])*(C%A==0)

然后,就是一般情况。

我们知道,AB同号时,x增加时,y减少,x减少时y增加。

我们设在做exgcd的时候得到的一组解为X,Y。

那么,如果X<lx||Y>ry,那么,我们要把他们都移进合法区间内。然后得到最极端的解。然后算出另一边的极端解,然后处理一下细节。

如果X>rx||Y<ly,也差不多。

如果原来X,Y就都在合法范围内,我们可以先把某一个处理得不合法,再做上面的工作。

具体怎么算极端解,我真的没法讲清楚,细节非常多。。

还有这种题要尽量避免分类讨论。。

code:

 #include<bits/stdc++.h>
 #define LL long long
 using namespace std;
 LL A,B,C,lx,rx,ly,ry,X,Y,gcd,delx,dely;
 LL sx,sy,tx,ty,del,x[],y[],ans,kx,ky,k;
 LL exgcd(LL A,LL B,LL &x,LL &y) {
     ; y=; return A;}
     LL g=exgcd(B,A%B,x,y);
     LL x0=y,y0=x-y*(A/B);
     x=x0; y=y0; return g;
 }
 bool range_xy(LL x,LL y) {return x>=lx&&x<=rx&&y>=ly&&y<=ry;}
 int main() {
     int T; cin>>T;
     ; ts<=T; ts++) {
         scanf("%lld%lld%lld",&A,&B,&C);
         scanf("%lld%lld%lld%lld",&lx,&rx,&ly,&ry);

         ) A=-A,lx=-lx,rx=-rx,swap(lx,rx);
         ) B=-B,ly=-ly,ry=-ry,swap(ly,ry);
         C=-C;
         &&B==) {
             printf()*(ry-ly+)*(C==)); continue;
         }

         gcd=exgcd(A,B,X,Y);
         ) {printf(); continue;}
         X=X*C/gcd,Y=Y*C/gcd;
         delx=B/gcd,dely=A/gcd,ans=;

         ) {
             ) ans=; )*range_xy(sx,ly);
             printf("Case %d: %lld\n",ts,ans); continue;
         }else
         ) {
             ) ans=; )*range_xy(lx,sy);
             printf("Case %d: %lld\n",ts,ans); continue;
         }

         sx=X,sy=Y;
         if (sx>=lx) {
             k=(sx-lx)/delx+;
             sx=sx-k*delx,sy=sy+k*dely;
         }
         if (sx<lx||sy>ry) {
             ) kx=(lx-sx)/delx; ;
             ) ky=(sy-ry)/dely; ;
             k=max(kx,ky);
             sx+=delx*k,sy-=dely*k;
             ;
             else {
                 kx=(rx-sx)/delx;
                 ky=(sy-ly)/dely;
                 k=min(kx,ky);
                 tx=sx+k*delx,ty=sy-k*dely;
                 ans=min((tx-sx)/delx+,(sy-ty)/dely+);
             }
         }else
         if (sx>rx||sy<ly) {
             ) kx=(sx-rx)/delx; ;
             ) ky=(ly-sy)/dely; ;
             k=max(kx,ky);
             sx-=delx*k,sy+=dely*k;
             ;
             else{
                 kx=(sx-lx)/delx;
                 ky=(ry-sy)/dely;
                 k=min(kx,ky);
                 tx=sx-k*delx,ty=sy+k*dely;
                 ans=min((sx-tx)/delx+,(ty-sy)/dely+);
             }
         };
         printf("Case %d: %lld\n",ts,ans);
     }
     ;
 }

[lightoj P1306] Solutions to an Equation的更多相关文章

  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 1306 - Solutions to an Equation 裸EXGCD

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

  3. Solutions to an Equation LightOJ - 1306

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

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

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

  5. 1306 - Solutions to an Equation

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

  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. [js]js栈内存的全局/私有作用域,代码预解释

    js代码如何执行的 浏览器提供执行环境: 全局作用域(提供js执行环境, 栈内存) --> 执行js需要预解释 - 带var : 提前声明 - 带function关键字的: 提前声明+定义 js ...

  2. 十、无事勿扰,有事通知(1)——NSNotification

    概述 很久很久以前,有一只菜鸟正在美滋滋的撸着他的嵌入式C代码.然而有一天,老板对菜鸟说:“别撸C了,从现在开始你就写swift开发ios了.”菜鸟一脸懵逼,但还是照做了. 又有一天,菜蛋谄媚的对菜鸟 ...

  3. [pat]1068 Find More Coins

    满背包问题,把体积和价值看成相等的.用滚动数组优化,然后额外开辟一个choice数组来记录每次的选择,然后回溯打印.因为要按字典序,先把价值进行排序.假如选最小的商品能装满m的话,那就把判断条件改成大 ...

  4. Python基础(十三) 为什么说python多线程没有真正实现多现程

    Python中的多线程没有真正实现多现程! 为什么这么说,我们了解一个概念,全局解释器锁(GIL). Python代码的执行由Python虚拟机(解释器)来控制. Python在设计之初就考虑要在主循 ...

  5. 《linux就该这么学》第三节课 第二节命令笔记

    命令笔记 (随笔原创,借鉴请修改) linux系统中一切都是文件 2.4  系统状态的命令:  ifconfig   :    查看系统网卡信息,包括网卡名称,ip地址,掩码,mac地址,收到数据包大 ...

  6. 队列ADT

    队列 队列是FIFO表,使用队列时在队尾(rear)插入元素,称之为入队(enqueue),以及在对头(front)删除并返回元素值,称之为出队(dequeue). 任何表的实现都可以用于实现队列结构 ...

  7. sublime设置tab为四个空格

    在首选项->设置里: 添加: "tab_size": 4, "translate_tabs_to_spaces": true,

  8. androidstudio项目如何使用git版本回退

    使用android studio 编写代码错误,有时可能会需要将项目版本回退到以前的某个版本上,这对于很多刚使用git的网友来说操作可能不是很懂,下面为大家整理了android studio 回退已经 ...

  9. i2c状态机方法设计-verilog

    2010-09-05 21:04:00 verilog语言基础学的差不多了.接着就是看看华为的语言编写规范.状态机设计方法是fpga的重要设计方法.所以我要记上一笔. 只要会FSM方法,用fpga编写 ...

  10. Python数据分析Numpy库方法简介(三)

    补充: np.ceil()向上取整 3.1向上取整是4 np.floor()向下取整 数组名.resize((m,n)) 重置行列 基础操作 np.random.randn()符合正态分布(钟行/高斯 ...