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

相关文章

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

【SGU】180. Inversions(归并排序求逆序数)

以前一般用树状数组和线段树做这种题 这次换个思路试试,归并排序! #include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn = 111111;int n;int array[maxn];int tmp[maxn];L

【SGU】271. Book Pile(双端队列模拟)

一摞书,2个操作,一个操作是在书堆上加一本,第二个将前K个书翻转 看别人用Splay树做的,但是可以用双端队列模拟,因为K个书之后的书位置已经定下来了,所以只需要记录在队列头加书还是尾加书 #include<cstdio>#include<string>#include<algorithm>#include<queue>#include<stack>#include<cstrin

多线程并发拓展

死锁 死锁是指两个或两个以上的进程,因争夺资源而造成一种互相等待的作用,如果没有外力作用它们都将无法推进下去,此时我们就称系统进入死锁状态 死锁必要条件 互斥条件:进程对所分配的资源进行排他性的使用,在一段时间内某资源只有一个资源占用,如果此时还有其它进程请求资源,那么请求者只能等待 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它资源占用,此时请求进程

Python 爬虫入门 - 基础数据采集流程拓展

在网络爬虫的世界里,数据就是一切。通过爬虫技术,你可以自动化地收集各种类型的公开数据,从文本和图片到复杂的结构化信息,这些数据为各类分析和应用提供了基础。 本教程将引导你深入了解爬虫可以采集的数据种类,如何有效地获取这些数据,并探讨如何使用代理服务来规避限制与增强爬虫的灵活性。无论是初学者还是有经验的开发者,这些知识都将帮助你在网络数据采集中更加游刃有余。 文章目录 可采集的数据基本操作

解决ax+by=c,不定方程(扩展欧几里得)

首先有几个定理我们需要知道,在这里我也会一一证明。 —————————————————————————————————————— 定理1:gcd(a,b)==gcd(b,a%b);这个是欧几里得提出并证明的。 (%是取余的意思,在数学中 可用mod表示); 以下是证明过程 —————————————————————————————————————— 令a = k * b + r; (k

【SGU】115. Calendar 水题= =

传送门:【SGU】115. Calendar 题目分析:2001年1月1号星期1,然后就没什么好说的了= = 代码如下: #include <map>#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespac