PAT乙级1103 缘份数

题目:

所谓缘分数是指这样一对正整数 a 和 b,其中 a 和它的小弟 a−1 的立方差正好是另一个整数 c 的平方,而 c 正好是 b 和它的小弟 b−1 的平方和。例如 83−73=169=132,而 13=32+22,于是 8 和 3 就是一对缘分数。

给定 a 所在的区间 [m,n],是否存在缘分数?

输入格式:

输入给出区间的两个端点 0<m<n≤25000,其间以空格分隔。

输出格式:

按照 a 从小到大的顺序,每行输出一对缘分数,数字间以空格分隔。如果无解,则输出 No Solution

输入样例 1:

8 200

输出样例 1:

8 3
105 10

输入样例 2:

9 100

输出样例 2:

No Solution

分析:

1、一对正整数a b构成缘分数,也就是a != b,所以a = b = 1虽然满足定义,但也不是缘份数。

2、计算出来a a-1的立方差,先判断该立方差是否是另一个数c的平方再去搜索b,效率更高。

3、搜索b的时候可以只搜索到c,因为b2 + (b-1)2 <= c2

代码:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    int m, n;
    cin >> m >> n;
    bool find = false;
    for(int a = m; a <= n; a++)
    {
        long long a3 = pow(a, 3) - pow(a - 1, 3);
        long long c = sqrt(a3);
        if(c * c == a3)		//判断是否正整数平方
        {
            for(int b = 2; b < c; b++)		//搜索下限2 上限c
            {
                long long b2 = pow(b, 2) + pow(b - 1, 2);
                if(c == b2)
                {
                    find = true;
                    cout << a << " " << b << endl;
                }
            }            
        }

    }
    if(!find) cout << "No Solution" << endl;
    return 0;
}

#刷题记录#
PAT乙级 文章被收录于专栏

PAT乙级(Basic)刷题记录

全部评论

相关推荐

11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务