SGU 106 The equation(拓展欧几里得)

2024-06-01 18:38

本文主要是介绍SGU 106 The equation(拓展欧几里得),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通解形式


然后利用x,y去求出范围,就能得到解的个数

注意特判a和b都为0的情况

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;typedef long long ll;
ll a, b, c;
double a1, a2, b1, b2;ll exgcd(ll a, ll b, ll &x, ll &y) {if (!b) {x = 1; y = 0; return a;}ll d = exgcd(b, a % b, y, x);y -= x * (a / b);return d;
}ll solve() {ll x, y;if (a == 0 && b == 0) {if (c == 0) return (a2 - a1 + 1) * (b2 - b1 + 1);return 0;}ll d = exgcd(a, b, x, y);if (d < 0) d = -d;if (c % d) return 0;double l = -1e50, r = 1e50;if (b / d < 0) {r = min(r, floor((a1 - c / d * 1.0 * x) / (b / d)));l = max(l, ceil((a2 - c / d * 1.0 * x) / (b / d)));} else {l = max(l, ceil((a1 - c / d * 1.0 * x) / (b / d)));r = min(r, floor((a2 - c / d * 1.0 * x) / (b / d)));}if (a / d < 0) {l = max(l, ceil((c / d * 1.0 * y - b1) / (a / d)));r = min(r, floor((c / d * 1.0 * y - b2) / (a / d)));} else {r = min(r, floor((c / d * 1.0 * y - b1) / (a / d)));l = max(l, ceil((c / d * 1.0 * y - b2) / (a / d)));}return max(0LL, (ll)(r - l) + 1);
}int main() {while (~scanf("%lld%lld%lld", &a, &b, &c)) {c = -c;scanf("%lf%lf", &a1, &a2);scanf("%lf%lf", &b1, &b2);printf("%lld\n", solve());}return 0;
}


这篇关于SGU 106 The equation(拓展欧几里得)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021805

相关文章

算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码网106 岛屿的周长

卡码网110 字符串接龙 这题一开始用的邻接表+dfs,不幸超时 #include <iostream>#include <list>#include <string>#include <vector>using namespace std;int minLen = 501;bool count(string a, string b) {int num = 0;for (int i

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

day16--513.找树左下角的值+112. 路径总和+106.从中序与后序遍历序列构造二叉树

一、513.找树左下角的值 题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/ 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www

DevExpress GridView 单元格进度条的绑定及拓展自定义进度条不同颜色显示

DevExpress提供进度条的控件ProgressBarControl,并且能在GridView的单元格中使用,效果图如图所示 关于单元格绑定progressBarControl,这里我简单介绍一下,列的ColumnEdit属性选择ProgressBarControl,然后设置选择的repositoryitemprogressBar1的ShowTitle属性来显示中间的百分数文本即可(其中

接口自动化拓展:Flask框架安装、介绍及工作中的应用!

Flask是一个轻量级的Python Web框架,用于构建Web应用程序和API。它简洁而灵活,容易上手,并且非常适合用于开发小型到中型规模的应用程序。在接口自动化测试中,Flask可以作为服务器框架,用于搭建测试接口。 本文将从零到一,详细介绍如何安装Flask框架、介绍Flask的基本概念和工作原理,并讨论在接口自动化测试中如何应用Flask框架。 一、安装Flask框架 要安装Flas

Studying-代码随想录训练营day16| 513找到左下角的值、112.路径总和、106从中序与后序遍历序列构造二叉树

第十六天,二叉树part03💪💪💪,编程语言:C++ 目录 513找到左下角的值 112.路径总和 113.路径总和II 106从中序与后序遍历序列构造二叉树  105.从前序与中序遍历序列构造二叉树  总结  513找到左下角的值 文档讲解:代码随想录找到左下角的值 视频讲解:手撕找到左下角的值 题目: 学习:注意是找到最底层最左边的值,而不是找到最左边

思维拓展

(1)不使用额外的空间交换两个数           a. 方法一.   A=A+B                              B=A-B;(A+B-B=A)                              A=A-B;(A+B-A=B)           b.方法二.   A=A^B                             B=B^A

Springboot拓展之整合邮件 JavaMail的使用与实操

邮件 电子邮件仍然是我们企业间交往的一种非常常见的方式 发送简单邮件 第一步首先导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.6.13</version></dependency> 这

Microsoft Edge浏览器安装crx拓展插件教程

1、首先打开edge浏览器,点击顶部地址栏。 2、在地址栏中输入"edge://flags/#extensions-on-edge-urls"并按下回车。2、在地址栏中输入"edge://flags/#extensions-on-edge-urls"并按下回车。 3、进入后,将图示选项改为“已禁用”。 4、修改完成后,点击右上角“三个点”。 5、打开下拉菜单中的“扩展”。

【洛谷P2054洗牌】AC代码(扩展欧几里得+二分快速幂+二分龟速乘)

题目描述 题目链接 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动。 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间。玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了。有人提出了扑克牌的一种新的玩法。 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数