AT_abc246_d 题解
本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。
题目简述
给定整数 \(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!!}
\]