洛谷 P5596 【XR-4】题

洛谷传送门

题目描述

小 X 遇到了一道题:

给定自然数 a,ba,b,求满足下列条件的自然数对 (x,y)(x,y) 的个数:

y^2 - x^2 = ax + by2−x2=a**x+b

他不会,只好求助于精通数学的你。

如果有无限多个自然数对满足条件,那么你只需要输出 inf 即可。

输入格式

一行两个整数 a,ba,b

输出格式

如果个数有限,一行一个整数,表示个数。

如果个数无限,一行一个字符串 inf

输入输出样例

输入 #1复制

输出 #1复制

输入 #2复制

输出 #2复制

输入 #3复制

输出 #3复制

输入 #4复制

输出 #4复制

输入 #5复制

输出 #5复制

说明/提示

【样例 1 说明】

(x,y) = (6,9)(x,y)=(6,9)


本题采用捆绑测试

  • Subtask 1(3 points):a = b = 0a=b=0。
  • Subtask 2(6 points):0 \le a,b \le 20≤a,b≤2,不存在无限个数的情况。
  • Subtask 3(9 points):0 \le a,b \le 1000≤a,b≤100,不存在无限个数的情况。
  • Subtask 4(13 points):0 \le a,b \le 10^30≤a,b≤103,不存在无限个数的情况。
  • Subtask 5(14 points):0 \le a \le 10^40≤a≤104,0 \le b \le 10^70≤b≤107。
  • Subtask 6(14 points):a = 0a=0。
  • Subtask 7(14 points):b = 0b=0。
  • Subtask 8(27 points):无特殊限制。

对于 100%100% 的数据,0 \le a \le 10^80≤a≤108,0\le b \le 10^{15}0≤b≤1015。

题解:

这篇题解即将刷新本蒟蒻写的最认真的数学题解的记录。

蒟蒻太菜了考试的时候只拿了18分

蒟蒻一开始的时候是这么想的:

观察原方程:

\[y^2-x^2=ax+b
\]

把它转化成函数形式:

\[y=\sqrt{x^2+ax+b}
\]

因为\(x,y\in N\),所以我一下子就想到了完全平方数这个东西。

如果能把右侧的部分换成这样的形式:

\[\sqrt{(x+k)^2},k\in N
\]

那就显然会有无数组解。

然后我们展开,变成:

\[\sqrt{x^2+2kx+k^2},k\in N
\]

和上面的对应上,就能列出一个等式关系:

当\(2k=a,k^2=b\)的时候,有无数组解。

一联立:

\[\frac{a}{2}=\sqrt{b}
\]

这个时候有无数组解,输出\(inf\)即可。

然后蒟蒻就没有思路了。

冥思苦想了很长时间,最后还是用了暴力枚举,剪枝还剪错了,只好用了最最暴力的两重循环枚举来解决了这个问题。只得了18分。

今天看到了正解,惊喜地发现,我和大佬们的思路竟然重合了那么\(1\%\),至少我推出来了无解的情况应该是什么样子的,而这种情况正是通往“有解”的情况的大门。

我们这样考虑:

因为原式子是个二元二次方程。这个方程很难搞。

如果我们把它换为一元方程的话,肯定就会容易一些。

但是我们还要求可行解的个数...怎么办呢?

灵光一闪(希望大家记住这个思想)

我们可以构造\(x,y\)的映射关系,这样求出一个合法的\(x\),肯定就会有一个合法的\(y\)与之对应,我们就可以少搞很多东西。

那么,我们以此入手,分析原式子可得两边均大于等于0.

我们怎么对这个式子进行处理呢?有一个方法被蒟蒻起了个名字:归一法,这个方法通俗一点讲,就是把一个主元用一些辅元表示,然后通过一些辅元的关系和范围等求出主元的解。

那么我们就可以设\(t=y-x,t\in N\).

这样,原式子就被我们搞成了这样:

\[(x+t)^2-x^2=ax+b
\]

整理:

\[x^2+2tx+t^2-x^2=ax+b
\]

再整理:

\[x=\frac{b-t^2}{2t-a}
\]

那么,在有解的范围内(也就是\(a/2\not= \sqrt{b}\)):

分类讨论:

一、\(\frac{a}{2}<\sqrt{b}\)时,有:

\[t\in (\frac{a}{2},\sqrt{b}]
\]

二、\(\sqrt{b}<\frac{a}{2}\)时,有:

\[t\in [\sqrt{b},\frac{a}{2})
\]

注意特判分母不得零的情况!!(化身数学班主任)

因为这个\(t\)定义的时候就是关于\(x,y\)的式子,所以当我们找到一个合法的\(t\),我们就找到了一组解\((x,y)\)。

基于此,我们只需要在\(t\)的范围内循环找可行解即可。

最后强调,代码实现的坑点是取整和特判...

代码:

#include<cmath>
#include<cstdio>
#define int long long
using namespace std;
int a,b,l,r,ans,n;
signed main()
{
scanf("%lld%lld",&a,&b);
r=sqrt(b);
l=a/2;
if(r*r==b && r*2==a)
{
printf("inf");
return 0;
}
else if(a==1 && b==0)
{
printf("1");
return 0;
}
else if(r>=l)
{
for(int i=l+1;i<=r;i++)
if((abs(b-i*i))%(abs(2*i-a))==0)
ans++;
printf("%lld",ans);
return 0;
}
else
{
if(l*2==a)
n=l-1;
else
n=l;
for(int i=r;i<=n;i++)
if((abs(b-i*i))%(abs(2*i-a))==0)
ans++;
printf("%lld",ans);
return 0;
}
}

洛谷 P5596 【XR-4】题的更多相关文章

  1. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  2. 洛谷 P2220 [HAOI2012]容易题 数论

    洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...

  3. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  4. 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国

    洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...

  5. 洛谷 P5596 【XR-4】题 题解

    原题链接 本题只要 推式子 就可以了. \[y^2-x^2=ax + b \] \[a x + x^2 = y^2 - b \] \[4 x^2 + 4 ax = 4 y^2 - 4b \] \[(2 ...

  6. 【洛谷P5596】【XR-4】题

    solution \(y^2-x^2=ax+b\) \(y^2=x^2+ax+b\) 当\(x^2+ax+b\)为完全平方式时\(Ans=inf\) \(x \leq y\) 不妨令 \(y=x+t\ ...

  7. 洛谷P1072Hankson的趣味题题解

    题目 一道十分经典的数论题,在考场上也可以用暴力的算法来解决,从而得到\(50pts\)的较为可观的分数,而如果想要AC的话,我们观察原题给的数据范围\(a,b,c,d\)(为了好表示,分别代表a1, ...

  8. 洛谷P4145 上帝造题的⑦minutes ②

    又是线段树. 区间开平方求和,套路题. 如果开到了1就不用再开下去了,否则直接到底. 记得 l > r 时交换 l r #include <cstdio> #include < ...

  9. 洛谷P1926 小书童—刷题大军【01背包】

    题目链接:https://www.luogu.org/problemnew/show/P1926 题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的 ...

随机推荐

  1. python 格式化打印

    #coding=utf-8 import time; start_time = time.time()for a in range(0,1001): for b in range(0,1001): f ...

  2. 3. 语法"陷阱"

    1. C运算符优先级 运算符(优先级从高到低) 结合律 ++(后置).--(后置).()(函数调用).[].{}.(复合字面量).. .-> 从左往右 ++(前置).--(前置).-.+.~.! ...

  3. GPG 密码修改

    一.前言 相信大家在使用gpp的时候都会遇到这样子都情况: 忘记密码 想要定时更换密码,保证安全 此时不用担心,gpg  的密码更新特别简单. 二.步骤说明 1> 执行命令获 gpg2 --li ...

  4. 【Notepad++】notepad++主题和字体设置(非常好看舒服的)

    #效果图 1.字体:Courier New 字号:14号字体 2.字体:Consolas 字号:14号字体 #设置方法 1.设置---语言格式设置 2.选择主题,同时勾选“使用全局字体”“使用全局字体 ...

  5. Kettle实现从数据库中提取数据到Excel

    因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ ...

  6. Java修饰符作用域

    作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 修饰 ...

  7. pytest框架之parametries数据驱动参数化

    在测试用例的前面加上:@pytest.mark.parametrize('参数名', 列表数据) 参数名:用来接收每一项数据,并作为测试用例的参数 列表参数:一组测试数据(元组.列表.字典) 方式一: ...

  8. JeeSite | 保存信息修改记录

    需求点 在很多场景中信息是不能轻易被修改的,修改时要么需要具备权限,要么需要审批,但是无论是哪种方式,修改前后的数据都是需要留有“案底”的,也就是说关键的信息被修改后是有修改记录的,一般修改记录会记录 ...

  9. JAVA 网络编程 - 实现 群聊 程序

    在实现 这个 程序之前, 我们 需要 了解 一些 关于 Java 网络 编程 的 知识. 基本 的 网络知识: 网络模型 OSI (Open System Interconnection 开放系统互连 ...

  10. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...