题解:立方数

Posted 24Kmagic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解:立方数相关的知识,希望对你有一定的参考价值。

题目描述

若一个数可以被写作是两个立方数的差,则这个数是立方差数。给定一个质数p,求p是不是立方差数。

解析

看到这道题我首先想到的是把所有的立方数预处理出来,然后进行爆搜。但是这样的复杂度太高了,于是我先想到了一个优化:

if(a[i] - a[j] > p) break;

a[] 是存立方数的数组。
但是这样还是不行(暴搜就是不行),那有没有更好的方法呢?
通过立方差公式可以得到:
a3 - b3 = (a - b) * (a2 + a * b + b 2)
那么如果p是质数就说明,这二者一个等于1,一个等于p,因为a,b都是大于0的,所以后者一定大于前者,所以a - b = 1.
所以a,b是相邻的两个数。
由此可得正解

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T;
long long p;
inline ll Read() {
    ll ans = 0;
    char Ch = getchar() , Las = \' \';
    while(!isdigit(Ch)) {Las = Ch;Ch = getchar();}
    while(isdigit(Ch)) {ans = (ans << 3) + (ans << 1) + Ch - \'0\';Ch = getchar();}
    if(Las == \'-\') ans = -ans;
    return ans;
}

inline void Write(ll x) {
    if(x < 0) {x = -x;putchar(\'-\');}
    if(x >= 10) Write(x / 10);
    putchar(x % 10 + \'0\');
}

inline ll val(ll x) {
    return x * x * x;
}

int main() {
    T = Read();
    while(T--) {
	    p = Read();
	    int flag = 0;
	    for(int i = 1; ; i++) {
		    if(val(i + 1) - val(i) > p) {
			    break;
		    }
		    if(val(i + 1) - val(i) == p) {
			    flag = 1;
		    }
	    }
	    if(flag == 1) printf("YES\\n");
	    else printf("NO\\n");
    }
    return 0;
}

以上是关于题解:立方数的主要内容,如果未能解决你的问题,请参考以下文章

水仙花数 题解

为啥模板测试不丢弃片段?

[bzoj4722] 由乃

CTS2019 题解

bzoj 3225: [Sdoi2008] 立方体覆盖 题解

#3164. 「CEOI2019」立方填词