Harmonic Number LightOJ - 1234
考察:打表+思维
直接开1e8的数组预处理会MLE.
所以需要压缩打表.每100存储一次.
预处理的时候看大佬有更好的方法,eg:用一个变量接收1~99之间的和,到%100==0时再赋值给数组
1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 const double ebp = 1e-12; 6 const int M = 1e8+10; 7 typedef long long ll; 8 double ans[M/100+10]; 9 void inits() 10 { 11 for(int i=1;i<=M;i++) 12 { 13 if(i%100==0) 14 { 15 ans[i/100] +=1.0/i; 16 ans[i/100+1]+=ans[i/100]; 17 }else ans[i/100+1] += 1.0/i; 18 } 19 } 20 int main() 21 { 22 inits(); 23 int T,kcase = 0; 24 scanf("%d",&T); 25 while(T--) 26 { 27 int n; scanf("%d",&n); 28 int b = n/100; 29 double res = ans[b]; 30 for(int i=b*100+1;i<=n;i++) 31 res+=1.0/i; 32 res+=ebp; 33 printf("Case %d: %.10lf\n",++kcase,res); 34 } 35 return 0; 36 }