万恶的2017 ACM/ICPC Asia Regional Qingdao Online 1011 A Cubic number and A Cubic Number

来源:互联网 发布:如何让win7网络更流畅 编辑:程序博客网 时间:2024/06/07 09:57

题目链接: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 0x7ffffffftypedef 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;}
阅读全文
0 0
原创粉丝点击