传智杯 2022 初赛 E 题解
题意简述:给一个数列
碎碎念:本来这个题是普及月赛 T2。
解法:
设一个
则一个
则相当于找到一个
而一个
事实上,这个数据范围是我故意设置的。mid=(l+r)/2 就可能爆 int。而如果要用求根公式,unsigned long long。
参考代码:
#include <iostream>
using namespace std;
int main()
{
int q;
cin >> q;
while (q--)
{
long long k,l=1,r=2e9,ans=0;
cin >> k;
while (l<=r)
{
long long mid=(l+r)/2;
if ((long long)mid*mid*2-mid>=k)
{
r=mid-1;
ans=mid;
}
else
l=mid+1;
}
ans--;
long long len=ans*ans*2-ans;
k-=len+1;
if (k<=ans)
cout << k << endl;
else if (k<=3*ans)
cout << 2*ans-k << endl;
else
cout << -4*ans+k << endl;
}
return 0;
}