hdu 6206 二分查找
2017ACM青岛网络赛……是我作为一个萌新参加的第一场大型的,正规的比赛,最开始我是分配的是hdu6210……当时是全场AC率为0……然而我的队友突然问我这道(hdu6216
)怎么做……队友是大佬
我看了一下,其实这大概就是那天的签到题,整体思路很简单:
1.立方数的范围限制在了100000以下,即long long以内
2.由立方差公式得a^3-b^3=(a-b)*(a^2+ab+b^2),因为p是素数,所以如果p是立方差,则a-b必须等于1,因为a^2+ab+b^2必然大于1
3.二分查找就好啦
上代码:
#include <bits/stdc++.h>
#define n 1000007
typedef long long LL;
int t,tmp;
LL dif[n];
inline void pre()
{
for(LL i=1;i<n;i++)
dif[i]=3*i*i+3*i+1;//公式,可从a^2+ab+b^2推
}
int main()
{
pre();
scanf("%d",&t);
while(t--)
{
LL p;
scanf("%lld",&p);
if(std::binary_search(dif,dif+n,p))//STL 二分
printf("YES\n");
else
printf("NO\n");
}
}