SGU 106 在区间范围内的线性方程解个数
题意:求解方程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 在区间范围内的线性方程解个数的更多相关文章
- 扩展欧几里德 SGU 106
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=106 题意:求ax + by + c = 0在[x1, x2], [y1, y2 ...
- SGU 106 The equation
H - The equation Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Subm ...
- HDU4622:Reincarnation(后缀数组,求区间内不同子串的个数)
Problem Description Now you are back,and have a task to do: Given you a string s consist of lower-ca ...
- echarts renderItem-在区间段内展示连续数据
一.需求背景: 贴图说明:要求数据在不同类型的区间段内展示. 二.实现思路及代码 实现方法: 利用echarts的自定义配置:option.series[i].type='custom'中的rende ...
- 区间求小于等于k的数字个数 hdu4177
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目意思给出一个序列,叫我们求一个区间里面小于等于k的数字个数. 这里面我用分块和主席树两种方法 ...
- hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙
/** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...
- 计蒜客 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 ...
- “全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- jsc 解码窥探
先使用 JS_DecodeScript反编译jsc 得到AST树 AST树词法解析 http://esprima.org/ AST还原成源码: npm install escodegen AST树遍 ...
- currentStyle和getComputedStyle来获取外部样式
currentStyle和getComputedStyle来获取外部样式 通过document.getElementById(id).style.XXX就可以获取到XXX的值,但意外的是,这样做只能取 ...
- 利用VS自带的命令行工具查看和生产PublicKeyToken
使用VS2008(或其他版本)命令行工具,键入:SN -T C:\*****.dll 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有强命 名,则不会有PublicKeyT ...
- shelll脚本,根据软链接,找到真实路径
[root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...
- common-configuration的一些应用
此程序依赖commons-configuration-1.6.jar和commons-lang-2.6.jar两个jar包. 需要先在工程的src目录下建立如下几个文件: config.propert ...
- hihoCoder-1089-Floyd
我们读入的时候,要考虑重边的问题,我们只取边的最小值就可以了. #include <cstdio> #include <cstring> const int INF = 0x3 ...
- 【Git版本控制】git---从已有分支拉出新的分支
参考博文:git---从已有分支拉出新分支
- mysql:having 用法
顺序:where -> group by -> min -> order by -> limit 在select语句中使用having 子句来指定一组行或聚合的过滤条件 hav ...
- 【java】 field 和 variable 区别及相关术语解释
Having said that, the remainder of this tutorial uses the following general guidelines when discussi ...
- Onenote代码高亮的实现方法
最终效果图 最终的效果图如下: VBA的编写参考 主要参考的是这篇博客中的思路:如何在Word中排出漂亮的代码 将VBA脚本复制到Word中并设置快捷键 Alt+F11 打开Word中的 VBS,将下 ...