AT_abc246_d 题解

洛谷链接&Atcoder 链接

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

1|0题目简述

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

  • XN
  • 存在一对非负整数 (a,b),使得 X=a3+a2b+ab2+b3

2|0思路

首先可进行优化 a3+a2b+ab2+b3 这一部分为 (a2+b2)×(a+b)

证明如下:

a3+a2b+ab2+b3

提取公因数 a2

=a2×(a+b)+ab2+b3

提取公因数 b2

=a2×(a+b)+b2×(a+b)

提取公因式 a+b

=(a2+b2)×(a+b)

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

可写一个 check(x,y) 函数返回传入的 xy 的值,判断 check(x,y) 是否 N,如 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; }

提交记录

The end!!


__EOF__

本文作者So_noSlack
本文链接https://www.cnblogs.com/So-noSlack/p/17577405.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   So_noSlack  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示