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\)大于零枚举时需要判断:

  1. x是否为正整数,即\((2x + 2y + a) + ( 2x - 2y + a) - 2a\) 是否是4的正整数倍;
  2. y是否为正整数,即\((2x + 2y + a) - ( 2x - 2y + a)\) 是否是4的正整数倍;

当\(a^2 - 4b\)小于零枚举时需要判断:

  1. x是否为正整数,即\((2x + 2y + a) - ( 2y - 2x - a) - 2a\) 是否是4的正整数倍;
  2. 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】题 笔记的更多相关文章

  1. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  2. C语言程序设计做题笔记之C语言基础知识(上)

    C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...

  3. SDOI2017 R1做题笔记

    SDOI2017 R1做题笔记 梦想还是要有的,万一哪天就做完了呢? 也就是说现在还没做完. 哈哈哈我竟然做完了-2019.3.29 20:30

  4. SDOI2014 R1做题笔记

    SDOI2014 R1做题笔记 经过很久很久的时间,shzr又做完了SDOI2014一轮的题目. 但是我不想写做题笔记(

  5. SDOI2016 R1做题笔记

    SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...

  6. 二级C语言真题笔记

    二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() {     short i ...

  7. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

  8. LCT做题笔记

    最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...

  9. java做题笔记

    java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...

  10. Python 刷题笔记

    Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...

随机推荐

  1. SHELL用法三(变量及参数设置)

    京峰JF2115-Day45上课笔记 1.SHELL编程变量命名规范: 变量分为:系统变量.环境变量.用户变量: 定义变量时使用=赋值,无需通过declare定义变量的类型: 变量赋值时,=前后是不能 ...

  2. cas单点登录打包时下载慢!

    环境:win10 百度网盘下载 版本:  cas-overlay-template-5.3  提取码    d1b6 添加阿里的到pom.xml    注意添加到第一列 <!--阿里云仓库--& ...

  3. <JZOJ4726>种花

    挺有意思的贪心 神奇的贪心 #include<cstdio> #include<iostream> #include<cstring> #include<al ...

  4. JAVA WEB期末项目第二阶段成果

    我们做的系统是一个基于Java web与MySQL的食堂订餐系统 班级: 计科二班 小组成员:李鉴宣.袁超 1.开发环境 开发编辑器使用:Visual Studio Code 数据库使用:MySQL8 ...

  5. web压测工具http_load

    1.什么是http_loadhttp_load是一款基于Linux平台的web服务器性能测试工具,用于测试web服务器的吞吐量与负载,web页面的性能. 2.http_load的安装1)下载地址:ht ...

  6. Linux设置redis密码登录

    第一种:永久方式 redis设置密码访问 你的redis在真是环境中不可以谁想访问就可以访问,所以必须要设置密码 设置密码的流程如下: vim  /etc/redis.conf 找到 #require ...

  7. 算法笔记-Day_01(1001 害死人不偿命的(3n+1)猜想

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 ...

  8. 2018.2最新-Scrapy+elasticSearch+Django打造搜索引擎(二)

    请问您今天要来个引擎吗? 工欲善其事必先利其器 最终项目上线演示地址: http://search.mtianyan.cn 第二节:我们搞搞比利,搞搞环境的搭建.Github地址: https://g ...

  9. rsync 增量同步总是多两行数据

    从google云机器rsync日志到本地,并通过logstash格式化后存入elasticsearch,但在实施过程中发现,每次rsync后通过查看elasticsearch,都会将上次已同步的数据再 ...

  10. Tornado 简述

    前言 python 旗下,群英荟萃,豪杰并起.单是用于 web 开发的,就有 webpy.web2py.bottle.pyramid.zope2.flask.tornado.django 等等,不一而 ...