根据均值不等式,AnGnA_n \geqslant G_n

可以得到

s+ns=2s+2ns22s+2ns2=2n2 s+\frac{n}{s} = \frac{2s + 2\frac{n}{s}}{2} \leqslant \sqrt[2]{2s + 2\frac{n}{s}} = 2\sqrt[2]{n}

显然当s=sqrt[2]ns = sqrt[2]{n}时成立,且取到最小值

例题

6280. 数列分块入门 4 - 题目 - LibreOJ

点击
//Author by [Rainboy](https://github.com/rainboylvx) 
//date: 2024-08-17 14:02:48
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#ifndef DEBUG
#define log(...)
#else
#define log(args...) { cout << "LINE:" << __LINE__ << " : ";string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) {}

template<typename T>
void err(istream_iterator<string> it, T a) {
cerr << *it << " = " << a << "\n";
}

template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
cerr << *it << " = " << a << ", ";
err(++it, args...);
}
#endif
const int maxn = 1e6+5;
int n,m;
ll a[maxn];
ll b[maxn];
ll s[maxn];
int bid[maxn];
int block_size;

int block_id(int p) {
    return (p-1)/block_size   +1;
}

void add(int l,int r,ll v) {
    int lid = bid[l];
    int rid = bid[r];

    if( lid == rid) {
        for(int i = l;i <= r;++i ) // i: lid->rid
        {
            a[i] += v;
            s[lid] += v;
        }

        return;
    }

    // 第一个区间
    for(int i = l;bid[i] == lid;i++) {
        a[i] += v;
        s[lid] +=v;
    }

    // 中间区间
    for(int i = lid+1 ;i < rid;i++) {
        b[i] += v;
        s[i] += block_size * v;
    }

    // 最后一个区间
    for(int i = r; bid[i] == rid;i--) {
        a[i] +=v;
        s[rid] +=v;
    }

}


ll query(int l,int r,int c){
    ll sum = 0;
    int lid = bid[l];
    int rid = bid[r];

    if( lid == rid) {
        for(int i = l ;i <= r;++i ) // i: lid->rid
        {
            sum += a[i] + b[lid];
            sum %= c;
        }
        return sum % c;
    }

    // 第一个区间
    for(int i = l;bid[i] == lid;i++) {
        sum += a[i] + b[lid];
        sum %= c;
    }

    // 中间区间
    for(int i = lid+1 ;i < rid;i++) {
        sum += s[i];
        sum %= c;
    }

    // 最后一个区间
    for(int i = r; bid[i] == rid;i--) {
        sum += a[i] + b[rid];
        sum %= c;
    }

    return sum % c;
}
void print_debug() {
    std::cout << "a[i] : " ;
    for(int i = 1;i <= n ;++i ) // i: 1->n
    {
        std::cout << a[i] << " ";
    }
    std::cout << "\n";

    std::cout << "s[i]: " << "";
    int r = block_id(n);
    for(int i = 1;i <= r ;++i ) // i: 1->r
    {
        std::cout << s[i] << " ";
    }
    std::cout  << "\n";
    std::cout << "b[i]: " << "";
    for(int i = 1;i <= r ;++i ) // i: 1->r
    {
        std::cout << b[i] << " ";
    }
    std::cout << "\n\n\n";

}

int main () {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); // 关闭io同步
    std::cin >> n;
    block_size = sqrt(n);
    for(int i = 1;i <= n ;++i ) // i: 1->n
    {
        std::cin >> a[i];
        bid[i] = block_id(i);
        s[bid[i]] += a[i];
    }
    for(int i = 1;i <= n ;++i ) // i: 1->n
    {
        int opt,l,r,c;
        std::cin >> opt >> l >> r >> c;
        if( !opt) {
            add(l,r,c);
            // print_debug();
        }
        else
        std::cout << query(l,r,c+1) << "\n";
    }

    return 0;
}

参考