P5596 【XR-4】题 笔记
P5596 【XR-4】题
其实这题我昨天没做出来……所以今天写一下笔记
昨天我还信誓旦旦地说这一定是一道黑题\(OTZ\)。果然菜是原罪。
另外吐槽一下科技楼机房频繁停电,昨天写了两小时的树刨和倍增全没了
题目描述
小 X 遇到了一道题:
给定自然数 \(a,b\)求满足下列条件的自然数对 \((x,y)\) 的个数:
\(y^2 - x^2 = ax + b\)
他不会,只好求助于精通数学的你。
如果有无限多个自然数对满足条件,那么你只需要输出 \(inf\) 即可。
输入格式
一行两个整数 \(a,b\)。
输出格式
如果个数有限,一行一个整数,表示个数。
如果个数无限,一行一个字符串 \(inf\)。
题解
\(y^2 - x^2 = ax + b\)
\(x^2 + ax + b = y^2\)
最朴素的第一想法一定是移项
刚开始想了一下求两函数交点,但是似乎不好搞,而且当时等号右边的方程还写错了
窝太菜了\(QWQ\)
然后正解应该是配一下方(如果我当时没有去想狗屎枚举……
\((x + \frac{1}{2}a)^2 + b - \frac{1}{4}a^2 = y ^ 2\)
这个式子就比较好看了,两个异号平方数,还有一项是常数,一定可以用平方差公式
\((x + \frac{1}{2}a)^2 - y ^ 2 = \frac{1}{4}a^2 - b\)
\((2x + 2y + a) * (2x - 2y + a) = a^2 - 4b\)
接着就可以暴力枚举了???
并不,直接枚举情况有、、多。
又因为题干中说数对\(( x, y) \geqslant 0\),所以\((2x+2y+a)\geqslant0\)。
那么我们就可以根据\(a^2 - 4b\)的情况来确定\((2x - 2y +a)\)的正负性,进而加快枚举速度。
当\(a^2 - 4b\)大于零枚举时需要判断:
- x是否为正整数,即\((2x + 2y + a) + ( 2x - 2y + a) - 2a\) 是否是4的正整数倍;
- y是否为正整数,即\((2x + 2y + a) - ( 2x - 2y + a)\) 是否是4的正整数倍;
当\(a^2 - 4b\)小于零枚举时需要判断:
- x是否为正整数,即\((2x + 2y + a) - ( 2y - 2x - a) - 2a\) 是否是4的正整数倍;
- y是否为正整数,即\((2x + 2y + a) + ( 2y - 2x - a)\) 是否是4的正整数倍;
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define rint register int
#define ll long long
ll a, b; //十年OI一场空,不开longlong见祖宗
int ans;
int main( void ){
scanf( "%lld%lld", &a, &b );
//cout << a << b;
ll delta;
delta = a * a - 4 * b;
//cout << temp;
if( delta == 0 ){
cout << "inf";
return 0;
}
//下面注意判断正负性,看哪个是i,哪个是j
if( delta >= 0ll ){
for( ll i = 1ll; i * i <= delta; i++ ){
if( delta % i ) continue;
if( ( delta / i + i - 2 * a ) % 4 != 0 || ( delta / i + i - 2 * a ) < 0 ) continue;
if( ( delta / i - i ) % 4 != 0 || ( delta / i - i ) < 0 ) continue;
ans++;
}
} else {
delta *= -1;
for( ll i = 1ll; i * i <= delta; i++ ){
if( delta % i ) continue;
if( ( delta / i - i - 2 * a ) % 4 != 0 || ( delta / i - i - 2 * a ) < 0 ) continue;
if( ( delta / i + i ) % 4 != 0 ) continue;
ans++;
}
}
printf( "%d", ans );
return 0;
}
看来数学还是得好好学啊(小声\(BB\)
P5596 【XR-4】题 笔记的更多相关文章
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- C语言程序设计做题笔记之C语言基础知识(上)
C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...
- SDOI2017 R1做题笔记
SDOI2017 R1做题笔记 梦想还是要有的,万一哪天就做完了呢? 也就是说现在还没做完. 哈哈哈我竟然做完了-2019.3.29 20:30
- SDOI2014 R1做题笔记
SDOI2014 R1做题笔记 经过很久很久的时间,shzr又做完了SDOI2014一轮的题目. 但是我不想写做题笔记(
- SDOI2016 R1做题笔记
SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...
- 二级C语言真题笔记
二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() { short i ...
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- LCT做题笔记
最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...
- java做题笔记
java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...
- Python 刷题笔记
Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...
随机推荐
- SQL Server 查询分析器的执行计划中的扫描方式,举例理解
student表,id,name,address id上建立聚集索引,Name建索引,address无索引.1. [Table Scan]:遍历整个表,查找所有匹配的记录行.这个操作将会一行一行的检查 ...
- cashier|gasoline|reservoir
N-COUNT 出纳(员);收银员A cashier is a person who customers pay money to or get money from in places such a ...
- 《内蒙古自治区第十二届大学生程序设计竞赛试题_D: 正品的概率》
问题 D: 正品的概率 内存限制:128 MB时间限制:1 S标准输入输出 题目类型:传统评测方式:文本比较上传者:外部导入 提交:36通过:7 返回比赛提交提交记录 题目描述 袋中有m枚正品硬币,n ...
- POJ 1251 & HDU 1301 Jungle Roads
题目: Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign ...
- Markdown 内嵌 HTML 语法
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.Markdown内嵌HTML,本文总结了一些常用的HTML标记用于扩展Markdow ...
- 不疯“模”不成活,海尔阿里II代电视将极致进行到底
我去过很多现场,经历过很多新品发布,各种概念,各种颠覆,有点见怪不怪.这次受邀海尔阿里II代电视发布会,本也是带着一颗平常心. 2点30分发布会准时开场,当 "智慧模块"在讲解员手 ...
- 基于OpenDDS应用程序开发(3)订阅端实现
连续的三篇博文演示如何基于OpenDDS开发应用程序,将数据从发布端节点发送到订阅端节点,该示例程序由一个发布者发布数据,一个订阅者订阅数据,使用默认的QoS策略和TCP/IP传输方式. 本文是第三篇 ...
- JDK1.8新特性Lambda表达式
/** * Lambda * @date 2019/8/2 10:03 */ public class Lamda { public static void main(String[] args){ ...
- Docker快速安装kafka
Docker快速安装kafka | 沈健的技术博客 盒子 盒子 博客 分类 标签 友链 搜索 文章目录 同样基于docker-compose安装,Docker快速部署nginx中有讲到,不在重述 1. ...
- Atom配置(VIM党) · iuunhao
为什么说是Vim党呢?首先我是一个深度的Vim用户,自己的电脑上基本上可以兼容Vim的插件都有,所有浏览器,所有编辑器都是Vim的操作方式,当然包括我现在书写的markdown的软件EME也是兼容的V ...