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 ...
随机推荐
- nodejs:遍历文件夹文件统计文件大小
根据 http://blog.csdn.net/hero82748274/article/details/45700465这里的思路对读写文件做了一个 封装: webpack在打包的时候可以借助ass ...
- CSS - position属性小结
Relative: 属于文档流,针对自身进行偏移: Absolute: 脱离文档流,针对最近的定位元素进行偏移,如果没有,则针对根元素,即body标签尽心偏移: Fixed: 和absolute基本一 ...
- UVa-232-纵横字谜的答案
这一题的话,输出的时候,我们要按照3位输出,不能按照两位,因为是10*10的网格,所以就是100位,不管有没有100的起始格,它都是按照3位进行输出的,从题上的输出可以看到,不然的话,就会PE. 然后 ...
- Safari不能保存session的处理方法
在vue单页应用项目中,safari浏览器验证码登陆提示'验证码过期'或者验证码校验不通过的问题 原因:验证码存储在了session里,接着验证时又发起了一次会话,因为Safari不保存cookie, ...
- php框架的特性总结
今天面试问到了php框架的特性,特此在这汇总一下,方便以后查看. Thinkphp 3.2特性: 1.多表查询非常方便,在model 里几句代码就可以完成完成多表的关联操作. 2.融合了smarty ...
- java 移位操作
http://blog.csdn.net/javazejian/article/details/51181320 java的移位操作
- JavaScript 逗号操作符
让我们从一个有趣的微博开始吧. 末尾的c是优先级最低的逗号操作符.逗号操作符是操作符优先级的最后一行,并且很少有文章记录,它隐藏着它的锋芒.它可能不是JavaScript强势操作符,但是我喜欢它.它简 ...
- [转]Mac屏幕录像转成gif
http://note.axiaoxin.com/contents/mac-video2gif.html 屏幕录像 打开Quicktime Player -> 文件 -> 新建屏幕录像 - ...
- 【LeetCode】Integer to Roman(整数转罗马数字)
这道题是LeetCode里的第12道题. 吐了,刚做完"罗马数字转整数",现在又做这个.这个没什么想法,只能想到使用if语句嵌套,或者使用哈希表.但哈希表我还不熟练啊.先拿if嵌套 ...
- 85. Spring Boot集成RabbitMQ【从零开始学Spring Boot】
这一节我们介绍下Spring Boot整合RabbitMQ,对于RabbitMQ这里不过多的介绍,大家可以参考网络上的资源进行安装配置,本节重点是告诉大家如何在Spring Boot中使用Rabbit ...