SPOJ ARCTAN (数论) Use of Function Arctan
详细的题解见这里。
图片转自上面的博客
假设我们已经推导出来x在处取得最小值,并且注意到这个点是位于两个整点之间的,所以从这两个整数往左右两边枚举b就能找到b+c的最小值。
其实只用往一边枚举就够了,由于对称性,我们不妨假设b ≤ c,那么只要让b从2a开始递减枚举即可。
1 #include <iostream> 2 using namespace std; 3 long long a, i; 4 int main(){int T;cin>>T;while(T--){cin>>a;i=a*2;while((i*i+1)%(i-a))i--;cout<<(i*i+1)/(i-a)<<endl;}return 0;}