AT_abc246_d 题解

洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给定整数 \(N\),请你找到最小的整数 \(X\),满足:

  • \(X \ge N\)
  • 存在一对非负整数 \((a,b)\),使得 \(X = a^3 + a^2b + ab^2 + b^3\)

思路

首先可进行优化 \(a^3 + a^2b + ab^2 + b^3\) 这一部分为 \((a^2 + b^2) \times (a + b)\)

证明如下:

\[a^3 + a^2b + ab^2 + b^3 \]

提取公因数 \(a^2\)

\[=a^2 \times (a + b) + ab^2 + b^3 \]

提取公因数 \(b^2\)

\[=a^2 \times (a + b) + b^2 \times (a + b) \]

提取公因式 \(a + b\)

\[=(a^2 + b^2) \times (a + b) \]

接着因为 \(a\)\(b\) 并无实质性差异,故可以假设 \(a \le b\) 去用双指针确定 \(X\) 的值。

可写一个 \(\operatorname{check}(x,y)\) 函数返回传入的 \(x\)\(y\) 的值,判断 \(\operatorname{check}(x,y)\) 是否 $ \ge N$,如 \(\ge N\)移动右区间并对答案取最小值,否则移动左区间即可。

注意\(ans\) 初始化需初始化为一个较大值

经过以上分析及小优化,很容易即可写出代码

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

long long n, x, l = 0, r = 1e6 + 1, ans = 0x3f3f3f3f3f3f3f3f; // ans 初始化为 long long 最大值

long long check(long long x, long long y) {
    return (long long)(pow(x, 2) + pow(y, 2)) * (x + y); // 小优化
}

int main() {
    cin >> n; // 输入
    // 双指针枚举
    while(l <= r) {
        if(check(l, r) < n) l ++; // 移动左区间
        else {
            ans = min(ans, check(l, r)); // 更新答案
            r --; // 移动右区间
        }
    }
    cout << ans << endl; // 输出答案,换行好习惯
    return 0;
}

提交记录

\[\text{The end!!} \]

posted @ 2023-07-24 15:38  So_noSlack  阅读(3)  评论(0编辑  收藏  举报