Funky Numbers CodeForces

来源:互联网 发布:linux mutex init 编辑:程序博客网 时间:2024/06/05 19:59

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

#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;}
原创粉丝点击