The equation SGU - 106
题目链接:https://codeforces.com/problemsets/acmsguru/problem/99999/106
这个题是关于EXGCD特别好的一个题目。题目大意:有一个等式ax+by+c=0,输入a,b,c以及a的范围l1,r1和b的范围l2,r2,输出满足方程的整数解的个数。
题解:
ax+by+c=0。对这个方程,首先考虑特殊情况:
1,a=0&&b=0&c=0,任意一个x和y都可以满足,所以答案为(r1-l1+1)*(r2-l2+1)
2,a=0&&b=0,直接输出0
3,a=0,方程转换为by=-c,判断c是否为b的倍数,不是的话直接输出0。是的话在判断y的范围,如果在(l2,r2)中,答案就是(r1-l1+1)b=0同理。
4,ax+by=-c。尽量让a和b都大于0。如果说a<0的话 那么将a变为正,再改变一下a的取值范围就好了,b大概差不多。将c移过去,并尽量保证-c大于等于0
5,ax+by=c,用exgcd求解。首先如果c不是gcd(a,b)的倍数,无解。否则将方程转换为a1x+b1y=c1。a1=a/gcd(a,b),b,c同理。用exgcd可以求出x的解集为x0+kb,y的解集为y0-ka。然后根据范围求k的取值范围。
6,求范围时会用到两个函数floor和ceil。其中floor表示向上取整如果4.9--4(小于4.9的最大整数),ceil为向下取整,3.1---4大于3.1的最大整数。然后上界取小,下界取大即可。
code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
return b == ? a : gcd(b, a % b);
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if (b==){
x=,y=;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
ll a, b, c;
cin >> a >> b >> c;
c=-c;
ll l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
if (c < ) {
c = -c; a = -a; b = -b;
}
if (a < ) {
a = -a; l1 = -l1; r1 = -r1; swap(l1, r1);
}
if (b < ) {
b = -b; r2 = -r2; l2 = -l2; swap(r2, l2);
}
if (a == && b == && c == ){
cout << (r1 - l1 + ) * (r2 - l2 + ) << endl;
return ;
}
else if (a == && b == ) { cout << << endl; return ; }
else if (b == ) {
if (c % b == && (-c) / b <= r2 && (-c) / b >= l2) cout << r1 - l1 + << endl;
else cout << << endl;
return ;
}
else if (a == ) {
if (c % a == && (-c) / a <= r1 && (-c) / a >= l1) cout << r2 - l2 + << endl;
else cout << << endl;
return ;
}
ll d = gcd(a, b);
if (c % d != ) puts("");
else {
ll x,y;
// c=-c;
a/=d;b/=d;c/=d;
exgcd(a,b,x,y);
x=x*c;y=y*c;
// cout<<a<<"--"<<b<<"=="<<c<<"--"<<d<<"==="<<x<<"--"<<y<<endl;
double rr1,ll1,rr2,ll2;
rr1=double(r1);ll1=double(l1);
rr2=double(r2);ll2=double (l2);
ll upx=floor((rr1-x)/b),downx=ceil((ll1-x)/b);
ll upy=floor((y-ll2)/a),downy=ceil((y-rr2)/a);
ll ans=min(upx,upy)-max(downx,downy)+;
cout<<(ans<? :ans)<<endl;
}
return ;
}
补充Exgcd(int a,int b,int &x,int &y)的知识:
证明:ax+by=gcd(a,b)k。先计算ax+by=gcd(a,b),求解后再成k即可。
bx+(a%b)y=gcd(b,a%b)。
a%b=a-(a/b)*b(这里的除为整数除法)
带入拆开得bx+ay-(a/b)*by=gcd(b,a%b)=gcd(a,b)=ax+by,然后对应相等,x=y,y=x-(a/b)*b*y
求出的解的集合就是x:x0+kb,y:y0-ka
exgcd code:
void exgcd(int a,int b,int &x,int &y){
if(b==) {x=,y=}
else {
exgcd(a,b,x,y);
int t=x;
x=y;y=t-a/b*y;
}
}
Exgcd还可以用来求解逆元。证明过程用到了同余方程即ax%b=c,也可记为ax=c(modb)当c等与1时,x就是a的逆元。
求解过程:ax-b*y=1,带入exgcd中,x就是a的逆元,要求就是a和b必须互质。
The equation SGU - 106的更多相关文章
- The equation - SGU 106(扩展欧几里得)
题目大意:有一个二元一次方程,给出系数值和x与y的取值范围,求出来总共有多少对整数解. 分析:有以下几点情况. 1,系数a=0, b=0, 当c != 0的时候结果很明显是无解,当c=0的时候x,y可 ...
- SGU 106 The equation
H - The equation Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Subm ...
- SGU 106 The equation 扩展欧几里德
106. The equation time limit per test: 0.25 sec. memory limit per test: 4096 KB There is an equation ...
- 数论 + 扩展欧几里得 - SGU 106. The equation
The equation Problem's Link Mean: 给你7个数,a,b,c,x1,x2,y1,y2.求满足a*x+b*y=-c的解x满足x1<=x<=x2,y满足y1< ...
- SGU 106 The equation 扩展欧几里得好题
扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...
- SGU 106 The Equation 扩展欧几里得应用
Sol:线性不定方程+不等式求解 证明的去搜下别人的证明就好了...数学题. #include <algorithm> #include <cstdio> #include & ...
- SGU 106 The equation【扩展欧几里得】
先放一张搞笑图.. 我一直wa2,这位不认识的大神一直wa9...这样搞笑的局面持续了一个晚上...最后各wa了10发才A... 题目链接: http://acm.hust.edu.cn/vjudge ...
- 扩展欧几里德 SGU 106
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=106 题意:求ax + by + c = 0在[x1, x2], [y1, y2 ...
- SGU 106.Index of super-prime
时间限制:0.25s 空间限制:4M 题目大意: 在从下标1开始素数表里,下标为素数的素数,称为超级素数(Super-prime),给出一个n(n<=10000) ...
随机推荐
- 洛谷 P2257 YY的GCD 题解
原题链接 庆祝: 数论紫题 \(T4\) 达成! 莫比乌斯 \(T1\) 达成! yy 真是个 神犇 前记 之前我觉得: 推式子,直接欧拉筛,筛出个 \(\phi\),然后乱推 \(\gcd\) 就行 ...
- RNN,GRU,LSTM
2019-08-29 17:17:15 问题描述:比较RNN,GRU,LSTM. 问题求解: 循环神经网络 RNN 传统的RNN是维护了一个隐变量 ht 用来保存序列信息,ht 基于 xt 和 ht- ...
- 倒影box-reflect(可图片可文字)
需要写兼容写法: -webkit-box-reflect:below 3px -webkit-(repeating)linear/redial-gradient(...): 1.先写direction ...
- MySQL count知多少
统计一个表的数据量是经常遇到的需求,但是不同的表设计及不同的写法,统计性能差别会有较大的差异,下面就简单通过实验进行测试(大家测试的时候注意缓存的情况,否则影响测试结果). 1. 准备工作 为了后续测 ...
- Crash
一.Crash类型 crash 一般产生自 iOS 的微内核 Mach,然后在 BSD 层转换成 UNIX SIGABRT 信号,以标准 POSIX 信号的形式提供给用户.NSException 是使 ...
- -bash: syntax error near unexpected token `newline'问题解决
原因:bash语法错误,例如, 仔细查看发现语句中不能有'<'和'>',删除这两个符号即可: 问题解决!
- [noip2012]国王游戏<贪心+高精度>
题目链接: https://vijos.org/p/1779 https://www.luogu.org/problem/show?pid=1080 http://codevs.cn/problem/ ...
- Ptask公告
这是一款非常弱鸡的小程序,不喜勿喷 你们好!如在使用中有bug或者有您宝贵的建议请在下方评论区留言或者投递至我的邮箱:Mj_Ymr@outlook.com. 那么我也会不断更新,并在这里贴上各版本的下 ...
- spring-cloud-gateway降级
前言 本文主要研究一下 spring cloud gateway 如何集成 hystrix. 当下游接口负载很大,或者接口不通等其他原因导致超时,如果接口不熔断的话将会影响到下游接口得不到喘息,网关也 ...
- 7行代码搞定WEB服务
作为一个 Java 程序猿,写代码久了,各种技术也就都尝试了一个遍. 先从 SSH1(Spring.Struts1.Hibernate)摸爬滚打转变到 SSH2(Spring.Struts2.Hibe ...