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. linux PC手把手搭建minigui3.0开发环境

    1.下载网址http://www.minigui.com/en/download/ 2.下载资料: 3.安装过程: (1)安装 libminigui-gpl-3.0.12.tar.gz tar zxv ...

  2. Arcgis Engine(ae)接口详解(5):IGeometry几何高级操作

    IPoint point = new PointClass(); point.PutCoords(, ); //ITopologicalOperator接口用于几何对象的几何操作 ITopologic ...

  3. Web 监听器

    什么事web 监听器? Servlet规范中定义的一种特殊类 用于监听ServletContext.HttpSession和ServletRequest等象的创建与销毁的事件 用监听域对象的属性发生修 ...

  4. 登录日志的访问日志的 统计 MapReduce

    登录日志的访问日志的 统计    MapReduce <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-commo ...

  5. Struts2的工作原理(图解)详解

    Struts2的工作原理 上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:https://github.com ...

  6. Random 类生成随机数

    Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...

  7. 用redis实现动态时间段内统计排序

    问题描述 需要根据某类数据在动态时间段内的统计值对这些数据进行排名.例如按过去24小时内点赞数排名的帖子,每隔一小时计算一次结果.以下描述均针对这个例子展开. 解决思路 针对这种问题,我的第一反应是直 ...

  8. js数据类型简单介绍

    JS数据类型 ECMAScript中有5种简单的数据类型:Undefined,Null,Boolean,Number,String.还有一种复杂的数据类型--Object(本质上是由一组无序的名值对组 ...

  9. 织梦DEDE后台定时分时段自动更新发布文章插件

    定时审核插件使用说明 一.立信CPA培训注册会计师考试网站 以超级管理员身份登录后台,依次选择[核心]à [定时审核管理],输入定时审核的时间段,如下图所示: 功能说明: 1. 可以设置若干时间段,在 ...

  10. SpringMVC配置环境

    一,lib目录下加入spring一般所需的jar包 二,配置web.xml <?xml version="1.0" encoding="UTF-8"?&g ...