国家集训队2009 书堆

时间:2019-08-30
本文章向大家介绍国家集训队2009 书堆,主要包括国家集训队2009 书堆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

洛谷

BZOJ

分析

实际上就是求重心坐标。

假设第 \(i\) 本书的重心为 \(g_i\) ,不难发现:

\[\frac{g_2+g_3+...+g_n}{n-1}+g_1=0\]

\[\frac{g_2+g_3+...+g_n}{n-1}-g_1=M\]

于是有:

\[g_n=\frac{M}{2}\sum^{n}_{i=1}{\frac{1}{i}}\]

但此题还要用到调和计数这个东西,由于窝太菜了,所以自行百度。

代码

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define il inline
#define re register
#define tie0 cin.tie(0),cout.tie(0)
#define fastio ios::sync_with_stdio(false)
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
using namespace std;
typedef long long ll;

template <typename T> inline void read(T &x) {
    T f = 1; x = 0; char c;
    for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1;
    for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    x *= f;
}

ll n, m;
double ans, eps = 1e-6;

int main() {
    read(n), read(m);
    if (n <= 1e7)
        for (int i = 2; i <= n*2; i += 2) ans += 1.0/i;
    else ans += (log(n) + 0.5772156649) / 2;
    ans *= m; ans -= eps;
    printf("%d\n", (int)ans);
    return 0;
}

原文地址:https://www.cnblogs.com/hlw1/p/11437197.html