您的位置:首页 > 其它

codeForces 192A.Funky Numbers(二分)

2017-10-31 15:34 369 查看
题意:给你一个数字N,问你是否存在两个数字A,B使得N=A(A+1)2+B(B+1)2

思路:上面这个式子等价于2N=A(A+1)+B(B+1),最简单想到的方法就是两重for循环枚举A,B的值从1−n√,这样复杂度为n2,看一下数据范围为1≤n≤109,限制时间为2s,n2复杂度肯定超时,所以我们可以枚举一个A,然后二分寻找B,这样复杂度为n∗logn的两秒应该能过去。

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int flag=0;
for(int i=1;i<sqrt(2*n);i++)
{
int A=i*(i+1)/2;
int low=i,high=sqrt(2*n),mid=(low+high)/2;
while(low<=high)
{
int B=mid*(mid+1)/2;
if(A+B<n)
{
low=mid+1;mid=(low+high)/2;
}
else if(A+B>n)
{
high=mid-1;mid=(low+high)/2;
}
else if(A+B==n)
{
flag=1;break;
}
}
if(flag==1)
{
break;
}
}
if(flag==0)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: