CodeForces 622A Infinite Sequence

来源:互联网 发布:ubuntu输密码进不去 编辑:程序博客网 时间:2024/04/20 04:37

传送门:http://codeforces.com/problemset/problem/622/A


有一个序列1 1 2 1 2 3 1 2 3 4……就是每次从1数到i(i>=1),求第n个数是多少


显然将序列分组

1

1 2

1 2 3

……

前k组共有k*(k+1)/2个,所以找到最大的k使,k*(k+1)/2<n,然后减掉就是答案,看数据规模我用二分找的

话说,标准的二分怎么写啊


代码如下:

#include<cstdio>#include<cmath>using namespace std;long long n;long long l,r,mid;int main(){scanf("%I64d",&n);l=1;r=(long long)sqrt(n);while (r>l+1){mid=(l+r)>>1;if (mid*(mid+1)/2<n){l=mid;}else{r=mid;}}l-=5;while (l<1){l++;}while (l*(l+1)/2<n){l++;}l--;n-=l*(l+1)/2;printf("%I64d\n",n);return 0;} 


0 0