題解:立方數
阿新 • • 發佈:2021-06-15
目錄
題目描述
若一個數可以被寫作是兩個立方數的差,則這個數是立方差數。給定一個質數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; }