题目描述
ADA Ⅱ型数是指能表达成p^2与q^3两者之乘积的整数,p和q均大于1且不相等。72=2^3*3^2, 是最小的ADA Ⅱ型数。给定一个整数n,判定其是否为ADA Ⅱ型数。
输入
少于4000行数据组成,每行一个整数n(0<n<2^31)。
输出
每个整数n对应一行输出,如果是ADA Ⅱ型数,则输出一行YES,否则输出一行NO。
样例输入
1
72
样例输出
NO
YES
反向思考
解题思路:一开始是想分别枚举p和q,结果时间超限。(枚举原因求结果)
运用反向思维,根据输入的数,枚举p,再二分查找q是否存在,时间就快了很多。(根据结果求原因)
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
long long i,b;
long long num;
long long temp;
long long high,low,mid;
while(scanf("%d",&n)!=EOF)
{
for (i=2;i<=816;i++)
{
num=i*i*i;
if(n%num!=0)
{
continue;
}
temp=n/num;
high=temp;
low=2;
//二分查找(折半查找)
while(low<=high)
{
mid=(low+high)/2;
b=mid*mid;
if(b==temp)
{
break;
}
if(b>temp)
high=mid-1;
else if(b<temp)
low=mid+1;
}
if(b==temp&&mid!=i)
break;
}
if (i<=816)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
循环里的816是因为,q最小是4,用2的31次方除以4的到一个数,在对这个数开三次方,就可以得到p最大的数。
本题的数据不是很强,810,811等数都可以AC。(主要是懂得这个思维方法)。具体思路看代码。