萬惡的2017 ACM/ICPC Asia Regional Qingdao Online 1011 A Cubic number and A Cubic Number

題目鏈接:A Cubic number and A Cubic Number
題意:我總結爲a^3 - b ^ 3 = p(a,b都是正整數,但a≠b),題目問給出一個質數p(p <= 10^12),如果p滿足式子,輸出“YES”,否則,輸出“NO”。
思路:(a ^ 3 - b ^ 3) = (a - b)*(a^2 + a*b + b^2) = p
由於p是質數,所有p的因子只有1和p。上述式子只有兩種情況:(a - b) = 1 && (a^2 + a*b + b^2) = p 或者 (a - b) = p && (a^2 + a*b + b^2) = 1。先看第一種情況,(a^2 + a*b + b^2) = (a^2 - 2*a*b + b^2 + 3*a*b) = (a-b)^2 + 3*a*b = p,∵(a - b) = 1,∴1 + 3*a*b = 1 + 3*b*(1+b) = p。
分析p <= 1e12,∴b <= 1e6,對b從1~1e6先for循環一遍把所有能的p存到數組中,再二分查找,題目解決。至於第二種情況,同樣的方法把a換b得到方程,但會發現b沒解,你會發現第二種情況是不可能的。
PS:爲啥說這個題萬惡,因爲這個題是在已經過了800個隊,比賽進行到了3個多小時的時候才做出來的,隊友和我當時心態都蹦了,最後今年的青島賽區還沒申請到名額…今年必須打一場regional的,這麼菜,怎麼辦。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<cstdlib>
#define mem(a,b) memset(a,b,sizeof(a))
#define INF 0x7fffffff
typedef long long ll;
using namespace std;
const int maxn = 1e6+10;
ll arr[maxn];
int main(){
    int cnt = 0;
    int T;
    ll n;
    for(ll i = 1; i <= 1000000; i++){
        arr[cnt++] = 3*i*(i+1)+1;
    }
    scanf("%d",&T);
    while(T--){
        scanf("%lld",&n);
        int ind = lower_bound(arr,arr+cnt,n) - arr;
        if(arr[ind] == n){
            puts("YES");
        }else{
            puts("NO");
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章