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的更多相关文章

  1. [lightoj P1306] Solutions to an Equation

    [lightoj P1306] Solutions to an Equation You have to find the number of solutions of the following e ...

  2. 1306 - Solutions to an Equation

    1306 - Solutions to an Equation    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Lim ...

  3. Jordan Lecture Note-6: The Solutions of Nonlinear Equation.

    The Solutions of Nonlinear Equation 本文主要介绍几种用于解非线性方程$f(x)=0$的一些方法. (1) Bisection Method. 算法: step 1: ...

  4. lightoj 1306 - Solutions to an Equation 扩展的欧几里得

    思路:看题就知道用扩展的欧几里得算法做!!! 首先我们可以求出ax+by=gcd(a,b)=g的一个组解(x0,y0).而要使ax+by=c有解,必须有c%g==0. 继而可以得到ax+by=c的一个 ...

  5. LightOJ 1306 - Solutions to an Equation 裸EXGCD

    本题是极其裸的EXGCD AX+BY+C=0 给你a b c 和x与y的区间范围,问你整数解有几组 作为EXGCD入门,题目比较简单 主要需要考虑区间范围的向上.向下取整,及正负符号的问题 问题是这正 ...

  6. (light oj 1306) Solutions to an Equation 扩展欧几里得算法

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...

  7. [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 ...

  8. [LeetCode] Solve the Equation 解方程

    Solve a given equation and return the value of x in the form of string "x=#value". The equ ...

  9. [Swift]LeetCode640. 求解方程 | Solve the Equation

    Solve a given equation and return the value of x in the form of string "x=#value". The equ ...

随机推荐

  1. php输出echo、print、print_r、printf、sprintf、var_dump比较

    php输出echo.print.print_r.printf.sprintf.var_dump比较 一.echo    echo() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如 ...

  2. 【配置关系】—Entity Framework实例详解

    实体间的关系,简单来说无非就是一对一.一对多.多对多,根据方向性来说又分为双向和单向.Code First在实体关系上有以下约定: 1. 两个实体,如果一个实体包含一个引用属性,另一个实体包含一个集合 ...

  3. 服务器返回JSON,IE出现下载问题

    我向来的观点,IE就是个奇葩. 服务器返回json,chrome处理得好地地,但IE却奇葩地向你请求是否要保存这个JSON文件? 之所以出现这种弱智现象,是因为IE无法识别一个所谓的响应头部:appl ...

  4. CentOS笔记-常用网络命令

    1.curl & wget 使用curl或wget命令,不用离开终端就可以下载文件.如你用curl,键入curl -O后面跟一个文件路径.wget则不需要任何选项.下载的文件在当前目录. cu ...

  5. 6.游戏特别离不开脚本(4)-应该避免将集合框架对象传给JS

    java map  传给 javascript 不是自动关联的,最好别传啊,遍历起来也麻烦(尽量避开集合框架吧),用数组或者自建一个对象.这里虽然有种方法: // build a Map Map< ...

  6. Mongoose Embedded Web Server Library

    https://github.com/cesanta/mongoose http://ltp.ai/docs/ltpserver.html LTP Server在轻量级服务器程序mongoose基础上 ...

  7. 使用zxing编写的二维码生成解析工具:QRCoder

    zxing GitHub地址 QRCoder GitHub地址 TipDialog.java package com.wolf_pan; import java.util.Timer; import ...

  8. Java中需要了解的点

    1.32位jvm.64位区别? 2.

  9. Linux内核中工作队列的使用work_struct,delayed_work【转】

    本文转载自:http://blog.csdn.net/zahuopuboss/article/details/43268983 初始化工作队列 调度工作队列 取消工作队列 #include <l ...

  10. Android Studio运行出现项目 错误:非法字符:“\ufeff”

    导入项目时,遇到编码问题. 主要原因是: eclipse可以自动把UTF-8+BOM文件转为普通的UTF-8文件,但Android Studio需要重新转换一下编码 解决方法: 将编码格式UTF-8+ ...