首页 > 其他分享 >“科林明伦杯”哈尔滨理工大学暑假训练赛 F 题解

“科林明伦杯”哈尔滨理工大学暑假训练赛 F 题解

时间:2022-10-04 10:12:39浏览次数:83  
标签:const 科林 明伦杯 题解 rhs int modint operator return

题目内容

传送门

img

前置知识

组合数
乘法逆元
Modular int模板

题目分析

分析输入与题意,本题关键即在推导有多少个不同数组的计算公式。

设当前数组最大值为 i,则有:

\[ans_i = C_{n + i - 1}^{i} \]

由于最大值的取值范围为 \(0\le x\le k\) 所以从 \(1\) 到 \(k\) 枚举 \(x\) 即可。

因此,

\[ans = \sum_{i = 0}^{k}i\times C_{n + i - 1}^{i} \]

代码实现

// URL: https://ac.nowcoder.com/acm/contest/37895/F
// Memory Limit: 524288 MB
// Time Limit: 2000 ms

#include <bits/stdc++.h>
using namespace std;

// #define int ll
using ll = long long;
using ull = unsigned long long;
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int N = 2e6;

template <int mod>
struct modint {
    unsigned int _v;
    modint() : _v(0) {}
    template <class T>
    modint(T v) {
        ll x = (ll)(v % (ll)(umod()));
        if (x < 0) x += umod();
        _v = (unsigned int)(x);
    }
    modint(bool v) { _v = ((unsigned int)(v) % umod()); }

    static constexpr unsigned int umod() { return mod; }
    unsigned int val() const { return _v; }

    modint& operator++() {
        _v++;
        if (_v == umod()) _v = 0;
        return *this;
    }
    modint& operator--() {
        if (_v == 0) _v = umod();
        _v--;
        return *this;
    }
    modint operator++(int) {
        modint result = *this;
        ++*this;
        return result;
    }
    modint operator--(int) {
        modint result = *this;
        --*this;
        return result;
    }

    modint& operator+=(const modint& rhs) {
        _v += rhs._v;
        if (_v >= umod()) _v -= umod();
        return *this;
    }
    modint& operator-=(const modint& rhs) {
        _v -= rhs._v;
        if (_v >= umod()) _v += umod();
        return *this;
    }
    modint& operator*=(const modint& rhs) {
        ull z = _v;
        z *= rhs._v;
        _v = (unsigned int)(z % umod());
        return *this;
    }
    modint& operator/=(const modint& rhs) { return *this = *this * rhs.inv(); }

    modint operator+() const { return *this; }
    modint operator-() const { return modint() - *this; }

    modint pow(ll n) const {
        assert(n >= 0);
        modint x = *this, r = 1;
        for (; n; n >>= 1) {
            if (n & 1) r *= x;
            x *= x;
        }
        return r;
    }

    modint inv() const { return pow(umod() - 2); }

    friend modint operator+(const modint& lhs, const modint& rhs) { return modint(lhs) += rhs; }
    friend modint operator-(const modint& lhs, const modint& rhs) { return modint(lhs) -= rhs; }
    friend modint operator*(const modint& lhs, const modint& rhs) { return modint(lhs) *= rhs; }
    friend modint operator/(const modint& lhs, const modint& rhs) { return modint(lhs) /= rhs; }
    friend bool operator==(const modint& lhs, const modint& rhs) { return lhs._v == rhs._v; }
    friend bool operator!=(const modint& lhs, const modint& rhs) { return lhs._v != rhs._v; }
};
typedef modint<mod> mint;

int n, k;
mint ans, fact[N + 7], fact_inv[N + 7];
void init(int n = N + 5) {
    fact[0] = 1;
    for (int i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i;
    fact_inv[n] = fact[n].inv();
    for (int i = n - 1; i >= 0; --i) fact_inv[i] = fact_inv[i + 1] * (i + 1);
}
mint C(int n, int m) { return m > n ? 0 : fact[n] * fact_inv[n - m] * fact_inv[m]; }

signed main() {
    fastio;
    cin >> n >> k;
    init(n + k + 1);
    for (int i = 0; i <= k; ++i) ans += C(n + i - 1, i) * i;
    cout << ans.val();

    return 0;
}

结果

img
img

标签:const,科林,明伦杯,题解,rhs,int,modint,operator,return
From: https://www.cnblogs.com/ckb2008/p/solution-of-Colin-Minlon-Summer-Cup-F.html

相关文章

  • 洛谷 P8557 炼金术 题解
    题目大意给定\(n\)种金属,放进\(k\)个熔炉,要求最终每种金属都要能从熔炉里拿出来,求熔炉炼金的方案数对\(998244353\)取模。分析从金属角度考虑。不难发现对于每......
  • 2019上半年(上午)网络工程师试题解析
    2019上半年(上午)网络工程师试题解析1.计算机执行指令的过程中,需要由( )产生每条指令的操作信号,并将信号送往相应的部件进行处理,以完成指定的操作。A.CPU的控制器 B.CPU的......
  • 【合集】AtCoder 比赛题解
    PartAABCABC266(A-Ex)ABC267(A-G)ABC268(A-D)ABC269(A-F)ABC270(D-E)ABC271(C-F)PartBARCARC148(C)......
  • CF1394C 题解
    传送门题意太长不说了。题解因为两个字符串相似的充要条件是任意重排,故可以不考虑\(B\)与\(N\)的相对顺序,只需记录各自的数量。以二者的数量建立坐标系,则一个字符......
  • 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand P
    AC题目列表C.BraveSeekersofUnicornsD.BankSecurityUnificationG.BiologicalSoftwareUtilitiesI.BinarySupersonicUtahraptorsJ.Bur......
  • springboot前后端分离,传递到前端的Long类型出现精度丢失的问题解决
    问题在后端,我的id是Long类型,但是我将他传到前端时,比如说我id在后端的参数是:15789456123456789传到前端后,就为......
  • CF1624G MinOr Tree 题解
    CF1624GMinOrTree给定\(n\)个点,\(m\)条边,求在或运算小的最小生成树考虑二进制拆位,从高位玩往地位贪心,如果答案第\(i\)位可以为\(0\),后\(i-1\)取值无论是多少......
  • luogu P7004 [NEERC2013]Interactive Interception 题解
    题目链接感觉比较玄学的交互,看了题解才会做。主体的思想是,我们在二分位置的同时也对\(v\)的范围进行修改。假设我们现在的区间是\([L,R]\),那么我们取\(mid=\frac{L......
  • BZOJ 2453 维护队列 题解
    带修莫队模板,双倍经验,注意add和del的顺序以及数据范围(洛谷上)。//bzoj#2453.维护队列#pragmaGCCoptimize(2)#include<bits/stdc++.h>usingnamespacestd;cons......
  • CF 617E XOR and Favorite Number 题解
    如果我们对给定的序列求出异或意义下的前缀和,哪么题意变为求满足\(sum_{i-1}\operatorname{xor}sum_j=k\)的\((i,j)\)数量。由于\(x\operatorname{xor}y=z\)等......