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的两秒应该能过去。
思路:上面这个式子等价于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; }
相关文章推荐
- CodeForces 785C Anton and Fairy Tale【二分答案+思维】
- Codeforces 426E Sereja and Two Sequences【思维+Dp+二分】好题!
- codeforces 551C(二分)
- CodeForces 732D - Exams(二分)
- Codeforces 633E. Startup Funding (概率+非递归线段树/Sparse Table +二分)
- 【CodeForces】660C - Hard Process(二分,尺取法)
- CodeForces 460C——二分+前缀和—— Present
- CodeForces 378C - Road to Cinema(二分)
- codeforces-729【思维】【二分】
- CodeForces - 817C Really Big Numbers(二分)
- CodeForces - 785C Anton and Fairy Tale(二分)
- CodeForces 165B - Burning Midnight Oil(二分)
- CodeForces 377B---Preparing for the Contest(二分+贪心)
- codeforces 350 div2 D Magic Powder - 2 二分
- CodeForces 371C Hamburgers(二分)
- CodeForces 377B 优先队列 + 二分
- codeforces 16C C. Monitor(二分)
- Codeforces 479E Riding in a Lift【Dp+前缀和优化+二分】好题~
- CodeForces 68B Energy exchange (二分查找)
- Codeforces 660C Hard Process【二分 Or 尺取】