题意:给定一个数n,求1到n中的每一项的平方分之一的累加和。
题解:题目没有给数据范围,而实际上n很大很大超过long long。因为题目只要求输出五位小数,我们发现当数大到一定程度时值是固定的 pi*pi/6。小的打表就行了,这里打表为了防止爆内存我用了优化的方法,类似于我之前写的 light oj 1234。
#include <iostream> #include <math.h> #include <stdio.h> #include <cstring> const int N=1e7+10; using namespace std; const double pi=acos(-1); double a[N/50+10]; char c[1000005]; int main() { int i,t,k=1; long long n; double cnt=pi*pi/6.0; double sum=1.0; a[0]=0.0; a[1]=1.0; for(i=2;i<=N;i++) { sum+=1.0/(double(i)*double(i)); if(i%50==0) a[i/50]=sum; } while(scanf("%s",c)!=EOF) { int len=strlen(c); if(len>=7) printf("%.5f ",cnt); else { n=0; for(int i=0;i<len;i++) n=n*10+(c[i]-'0'); //cout<<n<<"****"<<endl; long long b=n/50; double ans=a[b]; for(i=b*50+1;i<=n;i++) ans+=1.0/(double(i)*double(i)); printf("%.5f ",ans); } } return 0; }