先放一张搞笑图。。



我一直wa2,这位不认识的大神一直wa9。。。这样搞笑的局面持续了一个晚上。。。最后各wa了10发才A。。。


题目链接:

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=111527#problem/X

题意:

给定不定方程,问在给定x,y范围内的解有多少个?

分析:

很明显的扩欧。

但是这题要进行特判。。

  • a,b,c小于0.
  • a,b,c等于0

特判之后正常扩欧就好。。

问题是我们怎样获得给定区间的解的个数。

通解可以写成:

x=x0+k∗b/gcd

y=y0−k∗a/gcd

我们可以将这两个方程看成关于x0和y0的两个一次函数。

把他们放在同一坐标下,看给定函数值范围内,横坐标为整数的个数就好了。。

向上取整和向下取整处理一下。。

然后从这里开始无限的wa。。。后来看了题解才知道哪里错了。。

  1. 精度问题,floor和ceil函数参数要用double
  2. 可以自己实现一个floor和ceil函数,无需将参数全部转化为double。【注意负数的处理】

代码:

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
ll extgcd(ll a, ll b, ll &x, ll &y)
{
ll d = a;
if(b != 0){
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}else{
x = 1, y = 0;
}
return d;
}
ll upper(ll a, ll b)
{
if(a <= 0) return a / b;
return (a - 1) / b + 1;
}
ll lower(ll a, ll b)
{
if(a >= 0) return a / b;
return (a + 1) / b - 1;
}
int main (void)
{
ll a, b, c,x1, x2, y1,y2;
cin>>a>>b>>c>>x1>>x2>>y1>>y2;
if(c < 0) c = -c;
else { a = -a; b= -b;}
if(a < 0){a = -a; x1 = -x1; x2 = -x2; swap(x1, x2);}
if(b < 0){b = -b; y1 = -y1; y2 = -y2; swap(y1, y2);}
if(a * b == 0){
if(b){
ll yy = c / b;
if(c % b == 0 && yy >= y1 && yy <= y2) cout<<x2 - x1 + 1<<endl;
else cout<<0<<endl;
}else if(a){
ll xx = c / a;
if(c % a == 0 && xx >= x1 && xx <= x2) cout<<y2 - y1 + 1<<endl;
else cout<<0<<endl;
}else {
if(c != 0) cout<<0<<endl;
else cout<<(x2 - x1 + 1) * (y2 - y1 + 1)<<endl;
}
return 0;
}
ll x0, y0;
ll gcd = extgcd(a, b, x0, y0);
x0 *= c;
y0 *= c;
if(c % gcd != 0) return cout<<0<<endl, 0;
a /= gcd;
b /= gcd;
c /= gcd; long long bb = min (lower(x2 - x0, b), lower(y0 - y1, a));
long long aa = max (upper(x1 - x0, b), upper(y0 - y2, a));
if (bb < aa) cout<<0<<endl;
else cout<< bb - aa + 1<<endl; return 0;
}

SGU 106 The equation【扩展欧几里得】的更多相关文章

  1. SGU 106 The equation 扩展欧几里得好题

    扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...

  2. SGU 106 The Equation 扩展欧几里得应用

    Sol:线性不定方程+不等式求解 证明的去搜下别人的证明就好了...数学题. #include <algorithm> #include <cstdio> #include & ...

  3. SGU 106 The equation 扩展欧几里德

    106. The equation time limit per test: 0.25 sec. memory limit per test: 4096 KB There is an equation ...

  4. SGU 140 扩展欧几里得

    题目大意: 给定序列a[] , p , b 希望找到一个序列 x[] , 使a1*x1 + a2*x2 + ... + an*xn = b (mod p) 这里很容易写成 a1*x1 + a2*x2 ...

  5. poj 2891 扩展欧几里得迭代解同余方程组

    Reference: http://www.cnblogs.com/ka200812/archive/2011/09/02/2164404.html 之前说过中国剩余定理传统解法的条件是m[i]两两互 ...

  6. Codeforces7C 扩展欧几里得

    Line Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

  7. [codeforces 200 E Tractor College]枚举,扩展欧几里得,三分

    题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz ...

  8. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)

    http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...

  9. UVA 12169 Disgruntled Judge 枚举+扩展欧几里得

    题目大意:有3个整数 x[1], a, b 满足递推式x[i]=(a*x[i-1]+b)mod 10001.由这个递推式计算出了长度为2T的数列,现在要求输入x[1],x[3],......x[2T- ...

  10. UVA 10090 Marbles 扩展欧几里得

    来源:http://www.cnblogs.com/zxhl/p/5106678.html 大致题意:给你n个球,给你两种盒子.第一种盒子每个盒子c1美元,可以恰好装n1个球:第二种盒子每个盒子c2元 ...

随机推荐

  1. fsck和badlocks

    fsck可以检查好几种不同的文件系统,fsck只是一个中和程序而已,个别的文件系统检查程序都在/sbin中,可以使用ls -l /sbin/fsck* -A 按照/etc/fstab的内容,将所有的设 ...

  2. elasticsearch httpclient认证机制

    最近公司单位搬迁,所有的服务都停止了,我负责的elasticsearch不知道怎么回事,一直不能运行呢,因此,我一直在负责调试工作.经过两天的调试工作,我发现新的服务器增加了httpclient认证机 ...

  3. C++静态全局变量和全局变量的区别

      静态全局变量 非静态全局变量 存储方式 静态存储 静态存储 作用域 定义该变量的源文件内 所有源文件 解释: 共同点:全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量.全 ...

  4. OpenCV2:第二章 创建图像并显示

    一.简介 相当于在PS中,新建一个画布 二.CvMat类/LPLImage和CvMat结构体 参考: OpenCV2:第一章 图像表示 三.create() Mat m(2,2,CV_8UC3); m ...

  5. 教你学会Linux/Unix下的vi文本编辑器

    vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结. 首先,记住vi编辑器的两个模式:1.命令模式 2.编辑模式. 在一个UNIX/Linux的s ...

  6. sin_addr.s_addr和sin_addr.S_un.S_addr

    sin_addr.s_addr和sin_addr.S_un.S_addr 先mark一下,等下写

  7. 网络设置命令--ifconfig.setup

    ifconfig命令 作用:用于显示以及设置当前活动网卡信息 一.  显示当前活动网卡信息 ifconfig 从上面可以看到当前主要有2块活动网卡,eth0:代表当前本地真实网卡 lo:代表回访网卡, ...

  8. SVN 初级教程

    版本控制器:SVN 1.SVN 作用? 备份.代码还原.协同修改.多版本项目文件管理.追溯问题代码的编写人和编写时间.权限控制等. 2.版本控制简介 2.1 版本控制[Revision control ...

  9. Django之使用celery异步完成发送验证码

    使用celery的目的:将项目中耗时的操作放入一个新的进程实现 1.安装celery pip install celery 2.在项目的文件夹下创建包celery_tasks用于保存celery异步任 ...

  10. Go:json(序列化、反序列化)

    一.示例 package main import ( "encoding/json" "fmt" ) type Person struct { Name str ...