BZOJ2048 2009国家集训队 书堆 调和级数
题意:在一个桌子边缘摆完全相同的长度为M的N本书(方块),只要重心投影在桌子上就算合法,求最远可以向外延伸的距离。
题解:最后放置的书需要补偿之前所有的书向外延伸导致的重心外移,因此重心投影在桌子上的书的重心应与其他的书的整体重心与桌子边缘的偏移距离相同。因而第i本书的延伸长度应为1/2i(证明可以看POPOQQQ的CSDN,没图不好说QAQ),这个数列求和很常见啊(尤其是在某些数列大题里)。其近似前n项和ln(n+1)+r,n越大值越精确,r为欧拉常数约为0.57721566。为了防止卡精度,当n比较小的时候手动算,n比较大的时候套公式。
#include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define ll long long #define r 0.57721566 #define eps 1e-6 const int U=1000000; ll N,M; double ans; int main(){ cin >> N >> M; if(N<=U) for(int i=1;i<=N;i++) ans+=1.0/(double)i; else ans=log(1.0+N)+r; ans/=2.0,ans*=M; cout << (int)(ans-eps) << endl; return 0; }