传送门: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;
}