[lightoj P1306] Solutions to an Equation
[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的更多相关文章
- lightoj 1306 - Solutions to an Equation 扩展的欧几里得
思路:看题就知道用扩展的欧几里得算法做!!! 首先我们可以求出ax+by=gcd(a,b)=g的一个组解(x0,y0).而要使ax+by=c有解,必须有c%g==0. 继而可以得到ax+by=c的一个 ...
- LightOJ 1306 - Solutions to an Equation 裸EXGCD
本题是极其裸的EXGCD AX+BY+C=0 给你a b c 和x与y的区间范围,问你整数解有几组 作为EXGCD入门,题目比较简单 主要需要考虑区间范围的向上.向下取整,及正负符号的问题 问题是这正 ...
- Solutions to an Equation LightOJ - 1306
Solutions to an Equation LightOJ - 1306 一个基础的扩展欧几里得算法的应用. 解方程ax+by=c时,基本就是先记录下a和b的符号fla和flb(a为正则fla为 ...
- Jordan Lecture Note-6: The Solutions of Nonlinear Equation.
The Solutions of Nonlinear Equation 本文主要介绍几种用于解非线性方程$f(x)=0$的一些方法. (1) Bisection Method. 算法: step 1: ...
- 1306 - Solutions to an Equation
1306 - Solutions to an Equation PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Lim ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- [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 ...
- [LeetCode] Solve the Equation 解方程
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
- [Swift]LeetCode640. 求解方程 | Solve the Equation
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
随机推荐
- JQuery插件之【jqGrid】常用语法整理
jqGrid常用语法整理,包含数据获取.常用函数.触发事件等 jqGrid表格数据获取相关语法 获取表格所有数据 $("#grid").jqGrid("getRowDat ...
- 关于什么是SpringMVC,和SpringMVC基于xml配置、注解配置、纯注解配置
首先我们先要了解一下,什么是SpringMVC? SpringMVC是Spring框架内置的MVC的实现.SpringMVC就是一个Spring内置的MVC子框架,也就是说SpringMVC的相关包都 ...
- 腾讯云主机及CentOS7.2简单上手体验
前段时间拜读了崔庆才老师的<Python③网络爬虫开发实战>受益良多,对于初学爬虫的新手来说,本书真可谓是通俗易懂,非常适合新手入门.但是受制于没有服务器环境,书中很多例子难以模拟!最近正 ...
- Spark实时案例
1.概述 最近有同学问道,除了使用 Storm 充当实时计算的模型外,还有木有其他的方式来实现实时计算的业务.了解到,在使用 Storm 时,需要编写基于编程语言的代码.比如,要实现一个流水指标的统计 ...
- ATM目录结构
作者:高江平版本:1.0程序介绍: 实现ATM常用功能程序结构:atm实现|——README|——atm #ATM主程序目录| |——bin #ATM执行文件目录| | |——__init__.py| ...
- z-tree学习笔记
做项目时,需要用到带复选框的tree.经比较后优选了ztree,功能强大,文档清晰. http://www.treejs.cn/v3/api.php 直接上代码吧. 1.下载ztree后.将里面需要用 ...
- git之关联远程仓库
1.创建本地仓库. 2.与远程仓库交互. ----------------------------------------------------------------------------
- SpringMvc HandlerMethodResolver 的 handlerMethods & ServletHandlerMethodResolver 的 mappings 在哪里初始化的 ?
HandlerMethodResolver 的 handlerMethods & ServletHandlerMethodResolver 的 mappings 在哪里初始化的 ? 如下图:
- AARRR海盗模型简介
整理下AARRR模型的概念.实际应用场景等问题,初步感觉这个模型主要应用在APP应用分析中. 1.什么是AARRR模型 AARRR是Acquisition.Activation.Retention.R ...
- Consul 介绍
Consul 介绍 Consul是一个分布式.高可用性,在基础设施中发现和配置服务的工具. 主要功能 服务发现 通过DNS或HTTP接口使得消费者发现服务,应用程序可以轻松找到所依赖的服务. 健康检查 ...