The equation - SGU 106(扩展欧几里得)
题目大意:有一个二元一次方程,给出系数值和x与y的取值范围,求出来总共有多少对整数解。
分析:有以下几点情况。
1,系数a=0, b=0, 当c != 0的时候结果很明显是无解,当c=0的时候x,y可以为任意值,答案就是(x2-x1+1)*(y2-y1+1)
2,系数a=0, b!=0, 先判断y的唯一解是否是整数,并且在[y1,y2]范围内,如果在,答案就是x的个数,x2-x1+1,否则为0
3,系数b=0, a!=0, 先判断x的唯一解是否是整数,并且在[x1,x2]范围内,如果在,答案就是y的个数,y2-y1+1,否则为0
4,上面的特殊情况考虑完毕,因为要求余,但是给的系数是有负数的,所以先把负数转换成正数,符号转变的时候其所对应的取值范围也应对应转变,求出来x0,y0后,再用给定的范围求出t的范围,取两者交叉范围就是答案,注意向上向下取整问题,而且x计算出来的t是递增的,y 计算出来的t是递减的,要做相应转变。
代码如下:
===========================================================================================================
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
typedef long long LL;
using namespace std; LL ExGcd(LL a, LL b, LL &x0, LL &y0)
{
if(b == )
{
x0 = , y0 = ;
return a;
} LL d = ExGcd(b, a%b, x0, y0); swap(x0, y0);
y0 = y0 - a/b*x0; return d;
} int main()
{
LL a, b, c, x1, x2, y1, y2, x0, y0, ans = ; cin >> a >> b >> c;
cin >> x1 >> x2 >> y1 >> y2; c = -c;
if(c < ){c=-c; a=-a, b=-b;}
if(a < ){a=-a; swap(x1, x2), x1=-x1, x2=-x2;}
if(b < ){b=-b; swap(y1, y2), y1=-y1, y2=-y2;} if(a == && b==)
{
if(c == )
cout<< (y2-y1+)*(x2-x1+) <<endl;
else
cout << "" <<endl;
return ;
} if(a == )
{
if(c % b == && c/b >= y1 && c/b <= y2)
cout << x2-x1+ <<endl;
else
cout << "" <<endl; return ;
}
if(b == )
{
if(c % a == && c/a >= x1 && c/a <= x2)
cout << y2-y1+ <<endl;
else
cout << "" <<endl;
return ;
} LL d = ExGcd(a, b, x0, y0); if(c % d == )
{
a /= d, b /= d, c/=d;
x0 *= c, y0 *= c; LL L = max( ceil(1.0*(x1-x0)/b), ceil(1.0*(y0-y2)/a) );
LL R = min( floor(1.0*(x2-x0)/b), floor(1.0*(y0-y1)/a) ); if(L <= R)
ans = R-L+;
} cout << ans <<endl; return ;
}
The equation - SGU 106(扩展欧几里得)的更多相关文章
- SGU 140 扩展欧几里得
题目大意: 给定序列a[] , p , b 希望找到一个序列 x[] , 使a1*x1 + a2*x2 + ... + an*xn = b (mod p) 这里很容易写成 a1*x1 + a2*x2 ...
- SGU 106 The equation 扩展欧几里得好题
扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...
- poj 2891 扩展欧几里得迭代解同余方程组
Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...
- Codeforces7C 扩展欧几里得
Line Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Status ...
- [codeforces 200 E Tractor College]枚举,扩展欧几里得,三分
题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)
http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...
- UVA 12169 Disgruntled Judge 枚举+扩展欧几里得
题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...
- UVA 10090 Marbles 扩展欧几里得
来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...
- POJ 1061 青蛙的约会 扩展欧几里得
扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cs ...
- 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】
Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...
随机推荐
- (转) c# ExecuteNonQuery() 返回值 -1
这是之前我遇到问题,在网上找解决方法时找到的,当时复制到txt文档了,今天整理笔记又看到了,贴出来,便于以后查阅.原文的作者没记住~~ 查询某个表中是否有数据的时候,如果用ExecuteNonQuer ...
- Lua与C/C++交互问题
初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil( ...
- mysql建表出现Timestamp错误
mysql建表时如果有两个或以上的字段为Timestamp,那么可能会出现如下错误: Incorrect table definition; there can be only one TIMESTA ...
- Apache提示You don't have permission to access / on this server问题解决
测试时遇到将一本地目录设置为一apache的虚拟主机,在httpd-vhosts.conf文件中进行简单设置,然后在hosts文件中将访问地址指向本地,启动apache,进行访问,却出现了You do ...
- javascript ajax请求
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 常用css表达式-最小宽度-上下居中
/* IE6下最小宽度的CSS表达式 */ width:100%; min-width:1024px; _width:expression((document.documentElement.clie ...
- 下载安装sublime text3,打包sublime text3便携版,激活sublime text3,配置sublime text3的php环境
下载安装sublime text3: http://www.sublimetext.com/3 安装就一直下一步 打包sublime text3便携版 : 参考http://segmentfa ...
- PHP 常用命令
php常用命令: #输出语句 $ php -r "echo '123' . PHP_EOL;" #执行php脚本文件 $ php -f file.php #查看版本号 $ ph ...
- python核心编程2第二章课后练习
2-1 变量, print 和字符串格式化运算符.启动交互式解释器.给一些变量赋值(字符串,数值等等)并通过输入变量名显示它们的值.再用 print 语句做同样的事.这二者有何区别? 也尝试着使用字符 ...
- 需求分析Point
1.码段的查询结果的汇总值计算有问题.被删除的是否还算是被使用范围内呢?现在是即使废弃了也算使用的.这就有范围和重叠的问题,需要识别这种集合关系的数据好概念,并搞清楚他们的关系和概念.