第20个点WA了
本人使用一元二次方程暴解,具体思路和推导在代码最后面,感谢各位巨佬帮忙。
#include<bits/stdc++.h>
using namespace std;
long long q,n;
void solve(long long x){
long long delta=1+x*8,k=(1+sqrt(delta))/4;
double sq=sqrt(delta);
k+=((sq!=(int(sq)))||(int(1+sq)%4!=0));
long long res=k*4-3-2*k*k+k+x;
// printf("k=%d res=%d\n",k,res);
if(res<=(k*4-3)/4+1) cout<<res-1;
else if(res<=(k*4-3)/2+1) cout<<k-(res-((k*4-3)/4+1))-1;
else if(res<=(k*4-3)/4*3+1) cout<<-(res-((k*4-3)/2+1));
else cout<<-(k-(res-(k*4-3)/4*3-1)-1);
cout<<"\n";
}
int main(){
cin>>q;
while(q--){
cin>>n;
solve(n);
}
}
// a[i]=a[i-1]+1+(i-1)*4=i+(1+2+...+(i-1))*4=i+sum(i-1)*4
// 求第一个a[i]<k的i
// i+sum(i-1)*4<k
// 2*i*(i-1)+i<k
// 2*i*i-i<k
// 2*i*i-i-k<0
// delta=1+8*k
// i=(1+sqrt(delta))/4