题目大意

给出\(a,b,c,x_1,x_2,y_1,y_2\),求满足\(ax+by+c=0\),且\(x\in[x1,x2],y\in [y1,y2]\)的整数解有多少对。

题解

用扩展欧几里得算法算出方程\(ax+by=-c\)的一个解,再将该解移动到题目所要求的范围内。具体操作看代码。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define ll long long
#define NoAns {printf("0\n");return 0;} ll Exgcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = Exgcd(b, a % b, x, y);
ll tx = x;
x = y;
y = tx - y * (a / b);
return d;
} ll Gcd(ll a, ll b)
{
return b ? Gcd(b, a%b) : a;
} bool Solve(ll a, ll b, ll c, ll &x, ll &y, ll &deltaX, ll &deltaY)
{
int gcd = Gcd(a, b);
if (c%gcd != 0)
return false;
Exgcd(a, b, x, y);//易忘点:好好下定义,传入的参数不是a%gcd,b%gcd
x *= c / gcd;
y *= c / gcd;
deltaX = b / gcd;
deltaY = -a / gcd;//易忘点:负号
return true;
} ll MoveToRange(ll orgP, ll delta, ll l, ll r, ll toP, bool &moveFailed)
{
ll k = (toP - orgP) / delta;
int higherP = delta > 0 ? 1 : -1;
if (orgP + k * delta > r)
k-=higherP;//注意此处不能直接--,因为delta<0时k越小k*delta越大
else if (orgP + k * delta < l)
k+=higherP;
if (orgP + k * delta > r || orgP + k * delta < l)
moveFailed = true;
return k;
} int main()
{
ll a, b, c, x1, x2, y1, y2;
scanf("%lld%lld%lld%lld%lld%lld%lld", &a, &b, &c, &x1, &x2, &y1, &y2); if (x2 < x1 || y2 < y1)
NoAns if (a == 0 && b == 0)
{
if (c == 0)
printf("%lld\n", (x2 - x1 + 1) * (y2 - y1 + 1));
else
NoAns
return 0;
} if (a == 0)
{
if (c%b == 0 && y1 <= -c / b && -c / b <= y2)
printf("%lld\n", x2 - x1 + 1);
else
NoAns
return 0;
} if (b == 0)
{
if (c%a == 0 && x1 <= -c / a && -c / a <= x2)
printf("%lld\n", y2 - y1 + 1);
else
NoAns
return 0;
} ll x, y, deltaX, deltaY;
if (!Solve(a, b, -c, x, y, deltaX, deltaY))
NoAns bool moveFailed = false;
ll kx1 = MoveToRange(x, deltaX, x1, x2, x1, moveFailed);
ll kx2 = MoveToRange(x, deltaX, x1, x2, x2, moveFailed);
ll ky1 = MoveToRange(y, deltaY, y1, y2, y1, moveFailed);
ll ky2 = MoveToRange(y, deltaY, y1, y2, y2, moveFailed);
if (moveFailed)
NoAns if (kx1 > kx2)
swap(kx1, kx2);
if (ky1 > ky2)
swap(ky1, ky2);
ll kLow = max(kx1, ky1), kHigh = min(kx2, ky2);
if (kLow > kHigh)
NoAns printf("%lld\n", kHigh - kLow + 1);
return 0;
}

luogu2833 等式的更多相关文章

  1. NOIP200806 火柴棒等式【B005】

    [B005]火柴棒等式[难度B]———————————————————————————————————————————————————————————— [题目要求] 给你n根火柴棍,你可以拼出多少个 ...

  2. BZOJ2118墨墨的等式[数论 最短路建模]

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1317  Solved: 504[Submit][Status][Discus ...

  3. 【bzoj2118】 墨墨的等式

    http://www.lydsy.com/JudgeOnline/problem.php?id=2118 (题目链接) 题意 给出${B}$的取值范围${[Bmin,Bmax]}$,求方程${a_{1 ...

  4. Bzoj2118 墨墨的等式

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1488  Solved: 578 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+ ...

  5. NOIP2008提高组火柴棒等式(模拟)——yhx

    题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...

  6. 数论+spfa算法 bzoj 2118 墨墨的等式

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴 ...

  7. TYVJ P1012 火柴棒等式 Label:枚举

    背景 NOIP2008年提高组第二题 描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法 ...

  8. noip2008 火柴棒等式

    P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录   题目描述 给你n根火柴棍,你可以拼出多 ...

  9. SCAU 1138 代码等式

    1138 代码等式 时间限制:500MS  内存限制:65536K提交次数:59 通过次数:21 题型: 编程题   语言: 无限制 Description 一个代码等式就是形如x1x2...xi=y ...

随机推荐

  1. B - Taxi(贪心)

    Problem description After the lessons n groups of schoolchildren went outside and decided to visit P ...

  2. Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)

    Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...

  3. php常见报错

    Php常见错误提示 一.Fatal error: Call to undefined function……函数不存在,可能的原因:系统不存在这个函数且你也没自定义 二.syntax error, un ...

  4. 读书笔记「Python编程:从入门到实践」_7.用户输入和while循环

    7.1 函数input()的工作原理 函数input() 让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中,以方便你使用. message = input(&qu ...

  5. 浅谈Web缓存-缓存的实现过程详解

    在前端开发中,性能一直都是被大家所重视的一点,然而判断一个网站的性能最直观的就是看网页打开的速度.其中提高网页反应速度的一个方式就是使用缓存.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并 ...

  6. vue 中引入Jquery插件

    import $ from '../../static/js/jquery.min.js' window.jQuery = $; require('../../static/js/jquery.zoo ...

  7. 1016 部分A+B (15 分)

    正整数 AAA 的“DAD_AD​A​​(为 1 位整数)部分”定义为由 AAA 中所有 DAD_AD​A​​ 组成的新整数 PAP_AP​A​​.例如:给定 A=3862767A = 3862767 ...

  8. 利用python暴力破解压缩文件密码

    import randomimport sysimport zipfileimport timefrom threading import Threadfrom multiprocessing imp ...

  9. Docker在WIN7上的配置

    为什么使用Docker Toolbox Docker在Windows上使用有两种方式,一是利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端,二是利用Wi ...

  10. MyBatis学习总结(9)——使用MyBatis Generator自动创建代码

    一.构建一个环境 1. 首先创建一个表: [sql] view plaincopy CREATE TABLE t_user ( USER_ID INT NOT NULL AUTO_INCREMENT, ...