noip模拟赛 立方数
题目描述
LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。
现在给定一个数P,LYK想要知道这个数是不是立方数。
当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~
输入格式(cubic.in)
第一行一个数T,表示有T组数据。
接下来T行,每行一个数P。
输出格式(cubic.out)
输出T行,对于每个数如果是立方数,输出“YES”,否则输出“NO”。
输入样例
3
8
27
28
输出样例
YES
YES
NO
数据范围
对于30%的数据p<=100。
对于60%的数据p<=10^6。
对于100%的数据p<=10^18,T<=100。
分析:非常水,二分一下就可以了.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; int T; ll p; int main() { scanf("%d", &T); while (T--) { bool flag = false; scanf("%lld", &p); ll l = 0, r = 1000000; while (l <= r) { ll mid = (l + r) >> 1; if (mid * mid * mid > p) r = mid - 1; else if (mid * mid * mid < p) l = mid + 1; else { flag = 1; break; } } if (!flag) printf("NO\n"); else printf("YES\n"); } return 0; }