这道题,主要是数学分析
一开始我的想法是 穷举法,从小到大一个个列出来,再去判断情况
一直没通过
后来百度了一下,看到别人的代码,才明白如何做
别人分析如下:
这题很变态。一看题,我就没有做出来的信心了。不过看了大牛们的推导,那真是牛啊。
由公式 arctan(p)+arctan(q)=arctan[(p+q)/(1-pq)] 以及 arctan(1/a)=arctan(1/b)+arctan(1/c)
可得 :1/a = (1/b + 1/c)/ (1 - 1/(b*c)) 然后像下面那样推导
1/a = (1/b + 1/c)/ (1 - 1/(b*c)) => bc-1 = a(b+c)assume b=a+m and c=a+n (b and c is always bigger than a)(a+m)(a+n)-1=a(a+m+a+n)=> a*a+a*n+a*m+m*n-1=2*a*a+m*a+n*a=> m*n=a*a+1and thenfor(m=a;m>=1;m--) if((a*a+1)%m==0) break;n=(a*a+1)/mSource Code
Problem: 1183 User: AlbertLiu Memory: 132K Time: 16MS Language: C++ Result: Accepted- Source Code #include <stdio.h>int main(){ unsigned long a,i; scanf("%ld",&a); for(i=a;;i--)if((a*a+1)%i==0)break; printf("%ld\n",2*a+(a*a+1)/i+i);}
我的模仿的代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
long long int a;
cin>>a;
for(long long int m=a;;m--){
if((a*a+1)%m==0){
cout<<(2*a+m+(a*a+1)/m)<<endl;
break;
}
}
return 0;
}
这里一定要设置成long long int 不然通不过