Solutions to an Equation LightOJ - 1306
Solutions to an Equation LightOJ - 1306
一个基础的扩展欧几里得算法的应用。
解方程ax+by=c时,基本就是先记录下a和b的符号fla和flb(a为正则fla为1,为负则fla为-1,flb相同),然后对a和b取绝对值。求出ax+by=gcd(a,b)的一组解x=ansx,y=ansy,那么只有当c是gcd(a,b)的倍数时原方程才可能有解。设g=gcd(a,b),通解是x=ansx*(c/g)*fla+k*b/g*fla,y=ansy*(c/g)*flb-k*a/g*flb。这里设xa=ansx*(c/g)*fla,xb=b/g*fla,ya=ansy*(c/g)*flb,yb=-(a/g*flb)。
那么这题就是根据通解的式子和x和y的范围去求k的范围,基本操作就是手算一下解不等式。
举例:不等式(x相关):xa+k*xb>=x1,xa+k*xb<=x2
(解一下就会发现第一个式子解出的是k的最小值还是最大值,与xb的符号有关)
理论上不难,但是符号之类的细节实现起来有难度(...)。另外,a为0或b为0或a、b都为0时都需要特判(...)。
错误记录:
未特判0
upd:
以上应该有错。通解应该是x=ansx*fla+k*(b/g)*fla,y=ansy*flb-k*(a/g)*flb
通解就是那个没错的,但是要注意ansx和ansy是ax+by=gcd(a,b)的解,不是原方程的解。
如果有了一组原方程的解,求通解,那么就不要乘c/g
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
LL T,x,y,a,b,c,x1,x2,y11,y2,g;
LL gcd(LL a,LL b)
{
LL t;
while(b!=)
{
t=a;
a=b;
b=t%b;
}
return a;
}
LL exgcd(LL a,LL b,LL& x,LL& y)
{
if(b==)
{
x=;
y=;
return a;
}
else
{
LL t=exgcd(b,a%b,x,y);
LL t1=x;
x=y;
y=t1-a/b*y;
return t;
}
}
int main()
{
LL TT,fla,flb,xa,xb,ya,yb,kl,kr,kl1,kr1;
scanf("%lld",&T);
for(TT=;TT<=T;TT++)
{
scanf("%lld%lld%lld%lld%lld%lld%lld",&a,&b,&c,&x1,&x2,&y11,&y2);
c=-c;
if(a==&&b==)
{
if(c==)
{
printf("Case %lld: %lld\n",TT,max(0ll,(x2-x1+)*(y2-y11+)));
}
else
{
printf("Case %lld: %lld\n",TT,0ll);
}
continue;
}
if(a==)
{
if(c%b==&&(c/b>=y11)&&(c/b<=y2))
printf("Case %lld: %lld\n",TT,x2-x1+);
else
printf("Case %lld: %lld\n",TT,0ll);
continue;
}
if(b==)
{
if(c%a==&&(c/a>=x1)&&(c/a<=x2))
printf("Case %lld: %lld\n",TT,y2-y11+);
else
printf("Case %lld: %lld\n",TT,0ll);
continue;
}
fla=;flb=;
if(a<)
{
a=-a;
fla=-;
}
if(b<)
{
b=-b;
flb=-;
}
g=gcd(a,b);
if(c%g!=)
{
printf("Case %lld: %lld\n",TT,0ll);
continue;
}
exgcd(a,b,x,y);
xa=x*(c/g)*fla;
xb=b/g*fla;
ya=y*(c/g)*flb;
yb=-(a/g*flb);
//x=xa+k*xb,y=ya+k*yb
if(xb>)
{
kl=ceil((double)(x1-xa)/xb);
kr=floor((double)(x2-xa)/xb);
}
else
{
kr=floor((double)(x1-xa)/xb);
kl=ceil((double)(x2-xa)/xb);
}
if(yb>)
{
kl1=ceil((double)(y11-ya)/yb);
kr1=floor((double)(y2-ya)/yb);
}
else
{
kr1=floor((double)(y11-ya)/yb);
kl1=ceil((double)(y2-ya)/yb);
}
//if(kl1>kr1) swap(kl1,kr1);
printf("Case %lld: %lld\n",TT,max(min(kr1,kr)-max(kl1,kl)+,0ll));
}
return ;
}
Solutions to an Equation LightOJ - 1306的更多相关文章
- [lightoj P1306] Solutions to an Equation
[lightoj P1306] Solutions to an Equation You have to find the number of solutions of the following e ...
- 1306 - Solutions to an Equation
1306 - Solutions to an Equation PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Lim ...
- Jordan Lecture Note-6: The Solutions of Nonlinear Equation.
The Solutions of Nonlinear Equation 本文主要介绍几种用于解非线性方程$f(x)=0$的一些方法. (1) Bisection Method. 算法: step 1: ...
- lightoj 1306 - Solutions to an Equation 扩展的欧几里得
思路:看题就知道用扩展的欧几里得算法做!!! 首先我们可以求出ax+by=gcd(a,b)=g的一个组解(x0,y0).而要使ax+by=c有解,必须有c%g==0. 继而可以得到ax+by=c的一个 ...
- LightOJ 1306 - Solutions to an Equation 裸EXGCD
本题是极其裸的EXGCD AX+BY+C=0 给你a b c 和x与y的区间范围,问你整数解有几组 作为EXGCD入门,题目比较简单 主要需要考虑区间范围的向上.向下取整,及正负符号的问题 问题是这正 ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- [ACM_数学] Counting Solutions to an Integral Equation (x+2y+2z=n 组合种类)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27938#problem/E 题目大意:Given, n, count the numbe ...
- [LeetCode] Solve the Equation 解方程
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
- [Swift]LeetCode640. 求解方程 | Solve the Equation
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
随机推荐
- EnumChildWindows
EnumChildWindows 函数功能:枚举一个父窗口的所有子窗口. 函数原型:BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFu ...
- MongoDB经常使用命令
首先我们先安装这个数据库.你能够使用windows或者linux,但推荐使用的是linux,我使用的是ubuntu12.04.在下方的网址中共能够下载,基本都是64位的系统. 假设位linux系统也能 ...
- nodejs 实战
使用 Koa + MongoDB + Redis 搭建论坛系统 「新手向」koa2从起步到填坑 基于koa2和react的PC端脚手架 一键生成koa/koa2项目: nodejs原生,express ...
- mysql 数据库连接
1.需要mysql驱动包:mysql-connector-java-5.1.7-bin.jar 2. package com.jmu.ccjoin.web.controller; import jav ...
- jquery 获取radio被选中的值
<html> <head> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"& ...
- String bulit-in function
tip: 和tuple一样,字符串也是不可变的类型,字符串的内建函数有非常多,我们一一举例来看看他们的作用 下面是用dir(str) 输出的内容: ['__add__', '__class__', ' ...
- Oracle :修改数据库服务器字符集
最近,有现场反应,程序显示乱码.感觉很奇怪,该系统已经卖出去无数了.肯定是现场数据库字符集有问题,经过查看, 现场环境: window系统,oracle10g. 我们要求的数据库字符集是AL32UTF ...
- POJ - 1236 Network of Schools(有向图的强连通分量)
d.各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输, 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 问题2:至少需要添加几条传输线 ...
- hdu 4763 Theme Section(next数组找串中三段相等)
题意:在一个串中找 EAEBE 的形式的最长的E,其中E为一个字符串,也就是说找到前缀与后缀相同,并且串中还存在相同的一段,它们不能重复. 思路:利用next数组,next[len]代表的即是最大的相 ...
- wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用
之前的文章分析过,接受索引请求处理的代码在segmenter_worker.go里: func (engine *Engine) segmenterWorker() { for { request : ...