hdu 6216 A Cubic number and A Cubic Number

来源:互联网 发布:电动牙刷当跳蛋 知乎 编辑:程序博客网 时间:2024/06/03 19:08

题目链接:点这里。

Problem Description

A cubic number is the result of using a whole number in a multiplication three times. For example, 3×3×3=27 so 27 is a cubic number. The first few cubic numbers are 1,8,27,64 and 125. Given an prime number p. Check that if p is a difference of two cubic numbers.

Input

The first of input contains an integer T (1≤T≤100) which is the total number of test cases.For each test case, a line contains a prime number p (2≤p≤1012).

Output

For each test case, output 'YES' if given p is a difference of two cubic numbers, or 'NO' if not.

Sample Input

102357111317192329

Sample Output

NONONOYESNONONOYESNONO

【题意】

给你一个质数,问你是不是两个立方数的差,

【分析】

首先不妨设两个立方数较大的一个是a^3,较小的是b^3,利用立方差公式有

a^3-b^3 = (a-b)*(a^2+ab+b^2)

又因为给定的数是质数,所以显然可以得到的是a=b+1。然后利用之将上式化简为:

3*b*b+3*b+1

剩下的就简单多了,直接判断给定的质数是不是满足上式就行了。

【代码】

#include<iostream>#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<vector>#include<cmath>#include<stdlib.h>#include<time.h>#include<stack>#include<set>#include<map>#include<queue>#include<sstream>using namespace std;#define rep0(i,l,r) for(int i = (l);i < (r);i++)#define rep1(i,l,r) for(int i = (l);i <= (r);i++)#define rep_0(i,r,l) for(int i = (r);i > (l);i--)#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)#define MS0(a) memset(a,0,sizeof(a))#define MS_1(a) memset(a,-1,sizeof(a))#define MSinf(a) memset(a,0x3f,sizeof(a))#define MSfalse(a) memset(a,false,sizeof(a))#define pin1(a) printf("%d",(a))#define pin2(a,b) printf("%d %d",(a),(b))#define pin3(a,b,c) printf("%d %d %d",(a),(b),(c))#define pll1(a) printf("%lld",(a))#define pll2(a,b) printf("%lld %lld",(a),(b))#define pll3(a,b,c) printf("%lld %lld %lld",(a),(b),(c))#define pdo1(a) printf("%f",(a))#define pdo2(a,b) printf("%f %f",(a),(b))#define pdo3(a,b,c) printf("%f %f %f",(a),(b),(c))#define huiche puts("")#define inf 0x3f3f3f3f#define lson (ind<<1),l,mid#define rson ((ind<<1)|1),mid+1,r#define uint unsigned inttypedef pair<int,int> PII;#define A first#define B second#define pb push_back#define mp make_pair#define ll long long#define eps 1e-8inline void read1(int &num) {    char in;    bool IsN=false;    in=getchar();    while(in!='-'&&(in<'0'||in>'9')) in=getchar();    if(in=='-') {        IsN=true;        num=0;    } else num=in-'0';    while(in=getchar(),in>='0'&&in<='9') {        num*=10,num+=in-'0';    }    if(IsN) num=-num;}inline void read2(int &a,int &b) {    read1(a);    read1(b);}inline void read3(int &a,int &b,int &c) {    read1(a);    read1(b);    read1(c);}inline void read1(ll &num) {    char in;    bool IsN=false;    in=getchar();    while(in!='-'&&(in<'0'||in>'9')) in=getchar();    if(in=='-') {        IsN=true;        num=0;    } else num=in-'0';    while(in=getchar(),in>='0'&&in<='9') {        num*=10,num+=in-'0';    }    if(IsN) num=-num;}inline void read2(ll &a,ll &b) {    read1(a);    read1(b);}inline void read3(ll &a,ll &b,ll &c) {    read1(a);    read1(b);    read1(c);}inline void read1(double &num) {    char in;    double Dec=0.1;    bool IsN=false,IsD=false;    in=getchar();    while(in!='-'&&in!='.'&&(in<'0'||in>'9'))        in=getchar();    if(in=='-') {        IsN=true;        num=0;    } else if(in=='.') {        IsD=true;        num=0;    } else num=in-'0';    if(!IsD) {        while(in=getchar(),in>='0'&&in<='9') {            num*=10;            num+=in-'0';        }    }    if(in!='.') {        if(IsN) num=-num;        return ;    } else {        while(in=getchar(),in>='0'&&in<='9') {            num+=Dec*(in-'0');            Dec*=0.1;        }    }    if(IsN) num=-num;}inline void read2(double &a,double &b) {    read1(a);    read1(b);}inline void read3(double &a,double &b,double &c) {    read1(a);    read1(b);    read1(c);}///-------------------------------------------------------------------------------------------------------------const int maxm = 600000;ll ans[maxm];void init(void){    for(ll i = 1;i<maxm;i++)    {        ans[i] = (3*i+3)*i+1;    }}int main() {//    freopen("in.txt","r",stdin);    int T;    init();    ll x;    while(scanf("%d",&T)!=EOF) {         while(T--)         {             read1(x);             bool flag = true;             int l = 1,r = maxm-1;             while(l<r)//当时傻乎乎的写了个二分,后来发现数据给的贼小             {                 int mid = (l+r)>>1;                 if(ans[mid]==x)                 {                     flag = false;                     puts("YES");                     break;                 }                 else if(ans[mid]>x)                 {                     r = mid-1;                 }                 else l = mid+1;             }             if(flag)              {                 if(ans[l]==x) puts("YES");                 else puts("NO");             }         }    }    return 0;}
原创粉丝点击