题意:求解方程ax+by+c=0,在区间x1->x2和y1->y2的解的个数。

看似简单,真心a的不容易啊!

开始跪于第8组数据,原因是没用long long !后来改了,跪于12组,超时,于是,换方法,求出x的解,对应到y

,然后算在y1,y2的解有几个(不要用枚举法,算有几个就行)。竟然又跪于第4组数据!!哎,弱爆了。

才发现,x对应过去的y,x递增,y未必也递增,也未必递减啊!!

做线方程总结:

先判断有无解,再约分后得 ax+by=c,用扩展欧几里得求得ax+by=1的一解,x=x*c,y=y*c,便是原方程一组解了,

每俩个相邻解x,相差|b|,同理,y差|a|,然后就是看题目要求了,见招拆招了,如想要到去某点附近的解,

可以 x=x-(x1-x)/abs(b)*abs(b);(可能左右)。

#include<iostream>
#include<cmath>
using namespace std;
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
void exgcd(long long a,long long b,long long &x,long long &y)
{
if(b==0){x=1;y=0;}
else
{
exgcd(b,a%b,y,x);y=y-x*(a/b);
}
}
inline long long getabs(long long a)
{
return a<0?-a:a;
}
int main()
{
long long a,b,c,x1,x2,y1,y2;
cin>>a>>b>>c>>x1>>x2>>y1>>y2;
long long x,y;
c=-c; //移项
if(x1>x2||y1>y2){cout<<0<<endl;return 0;} //排除无解的情况
if(a==0&&b==0) //特殊情况讨论
{
long long ans=0;
if(c==0)
{
ans=(x2-x1+1)*(y2-y1+1); //此处任意组合都可以
}
cout<<ans<<endl;
return 0;
}
if(a==0)
{
if(c%b!=0){cout<<0<<endl;return 0;}
else
{
y=c/b;
if(y>=y1&&y<=y2)
cout<<x2-x1+1<<endl;
else cout<<0<<endl;
return 0;
}
}
if(b==0)
{
if(c%a!=0){cout<<0<<endl;return 0;}
else
{
x=c/a;
if(x>=x1&&x<=x2)cout<<y2-y1+1<<endl;
else cout<<0<<endl;
return 0;
}
}
long long g=getabs(gcd(a,b));
if(c%g!=0){cout<<0<<endl;return 0;}
a=a/g;b=b/g;c=c/g; //约去最大公约数 exgcd(a,b,x,y); //求得一组解
x=x*c;
y=y*c; //原方程一组解
x=x-(x-x1)/getabs(b)*getabs(b); //得与x1最近的一解x(x>=x1)
while(x<x1)x+=getabs(b);
if(x>x2){cout<<0<<endl;return 0;}
long long xx=x+(x2-x)/getabs(b)*getabs(b); //解x->xx(x>=x1,xx<=x2)
y=(c-a*x)/b; //对应yy,y,注意,此处yy,y大小不知道!!
long long yy=(c-a*xx)/b;
long long ans=0;
/* while(x<=xx) //若用枚举解,超时
{
if(y>=y1&&y<=y2)ans++;
x+=getabs(b);
y=(c-a*x)/b;
}*/
if(yy>y){long long temp=y;y=yy;yy=temp;} //大小决定一下
if(yy<y1) //取在区间y1->y2之间的解。(y,yy为边界解)
{
yy=yy+(y1-yy)/getabs(a)*getabs(a);
while(yy<y1)yy+=getabs(a);
}
if(y2<y)
{
y=y-(y-y2)/getabs(a)*getabs(a);
while(y>y2)y-=getabs(a);
}
if(y>=yy)
ans=(y-yy)/getabs(a)+1;
cout<<ans<<endl;
}

SGU 106 在区间范围内的线性方程解个数的更多相关文章

  1. 扩展欧几里德 SGU 106

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=106   题意:求ax + by + c = 0在[x1, x2], [y1, y2 ...

  2. SGU 106 The equation

    H - The equation Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Subm ...

  3. HDU4622:Reincarnation(后缀数组,求区间内不同子串的个数)

    Problem Description Now you are back,and have a task to do: Given you a string s consist of lower-ca ...

  4. echarts renderItem-在区间段内展示连续数据

    一.需求背景: 贴图说明:要求数据在不同类型的区间段内展示. 二.实现思路及代码 实现方法: 利用echarts的自定义配置:option.series[i].type='custom'中的rende ...

  5. 区间求小于等于k的数字个数 hdu4177

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目意思给出一个序列,叫我们求一个区间里面小于等于k的数字个数. 这里面我用分块和主席树两种方法 ...

  6. hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

    /** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...

  7. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  8. “全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. jsc 解码窥探

    先使用 JS_DecodeScript反编译jsc  得到AST树 AST树词法解析 http://esprima.org/ AST还原成源码: npm install escodegen AST树遍 ...

  2. currentStyle和getComputedStyle来获取外部样式

    currentStyle和getComputedStyle来获取外部样式 通过document.getElementById(id).style.XXX就可以获取到XXX的值,但意外的是,这样做只能取 ...

  3. 利用VS自带的命令行工具查看和生产PublicKeyToken

    使用VS2008(或其他版本)命令行工具,键入:SN -T C:\*****.dll 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有强命 名,则不会有PublicKeyT ...

  4. shelll脚本,根据软链接,找到真实路径

    [root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...

  5. common-configuration的一些应用

    此程序依赖commons-configuration-1.6.jar和commons-lang-2.6.jar两个jar包. 需要先在工程的src目录下建立如下几个文件: config.propert ...

  6. hihoCoder-1089-Floyd

    我们读入的时候,要考虑重边的问题,我们只取边的最小值就可以了. #include <cstdio> #include <cstring> const int INF = 0x3 ...

  7. 【Git版本控制】git---从已有分支拉出新的分支

    参考博文:git---从已有分支拉出新分支

  8. mysql:having 用法

    顺序:where -> group by -> min -> order by -> limit 在select语句中使用having 子句来指定一组行或聚合的过滤条件 hav ...

  9. 【java】 field 和 variable 区别及相关术语解释

    Having said that, the remainder of this tutorial uses the following general guidelines when discussi ...

  10. Onenote代码高亮的实现方法

    最终效果图 最终的效果图如下: VBA的编写参考 主要参考的是这篇博客中的思路:如何在Word中排出漂亮的代码 将VBA脚本复制到Word中并设置快捷键 Alt+F11 打开Word中的 VBS,将下 ...