首页 > 其他分享 >无所畏惧的求和题解

无所畏惧的求和题解

时间:2023-03-31 17:58:48浏览次数:51  
标签:系数 求和 题解 sum 无所畏惧 int 公式 binom aligned

无所畏惧的求和题解

本题是本人目前出的题中难度最高的题。

可能可以评一个黑?可能有点过,但是紫色是肯定可以的。

题目链接:无所畏惧的求和 - 洛谷

尽情享受吧!


这道题其实做法有很多:

  • 待定系数法 + 矩阵求解 推代数公式

  • 组合数学 + 待定系数法 推组合公式

  • 第一类斯特林数(时间复杂度可能有点问题,为 \(O(k^2)\)

  • 拉格朗日插值法&牛顿插值法(我表示我不会)

  • 伯努利数(奇奇怪怪)

  • ……

那么这里讲解前两种方式

代数公式

自然数幂方求和公式?在高等教育出版社出版的《数学手册》中有这么一些公式:

采用万能的数学归纳法可以一一证明上述公式。此处不提。

但是观察上述公式,可以发现一个特征:自然数 \(k\) 次幂求和公式是关于 \(n\) 的 \(k + 1\) 次有理多项式。

也就是

\[\sum_{i=1}^n i^k = \sum_{j=1}^{k+1} a_j n^{j} \]

知道上述结果之后,可采用待定系数法,也就是写出 \(n = 1, 2, 3, \dots, k+1\) 的 \(k + 1\) 个代数式,利用矩阵求解即可。

举个例子,对于 \(k = 3\) 的情况:

\[\begin{aligned} \sum_{i=1}^1 i^3 &= a_1 + a_2 + a_3 + a_4 &= 1 \\ \sum_{i=1}^2 i^3 &= 2a_1 + 4a_2 + 8a_3 + 16a_4 &= 9 \\ \sum_{i=1}^3 i^3 &= 3a_1 + 9a_2 + 27a_3 + 81a_4 &= 36 \\ \sum_{i=1}^4 i^3 &= 4a_1 + 16a_2 + 64a_3 + 256a_4 &= 81 \\ \end{aligned} \]

那么借此求出每一项的系数即可对于每一个询问在 \(O(k)\) 的复杂度内完成计算。

总的复杂度为 \(O(k^3 + T \cdot k)\)。但是,很明显,对于每一个测试点不会有所有的 \(k\)。所以请在必要时再计算系数。

组合公式

这个方法相对优秀一点点。标程就是用的此写法。

其实不难发现,对于 \(x^k\),我们可以改写为:

\[x^k = \sum_{i=1}^{k} a_i\binom{k}i \]

那么依据某些公式推导:

\[\sum_{x=1}^n x^k = \sum_{i = 2}^{k + 1} a_{i-1} \binom {n+1}i \]

所以,类似的,我们也可以枚举 \(n = 1, 2, 3, \dots, k\) 来寻找其系数:

以 \(k = 3\) 为例

\[\begin{aligned} \sum_{x=1}^1 &= a_1 \binom 22 + a_2 \binom 23 + a_3 \binom 24 = 1 \\ \sum_{x=1}^2 &= a_1 \binom 32 + a_2 \binom 33 + a_3 \binom 34 = 9 \\ \sum_{x=1}^3 &= a_1 \binom 42 + a_2 \binom 43 + a_3 \binom 44 = 36 \\ \end{aligned} \]

同时我们规定 \(\binom nr = 0\ (n \lt r)\)。所以上式也可以写为

\[\begin{aligned} \sum_{x=1}^1 &= a_1 \binom 22 &= 1 \\ \sum_{x=1}^2 &= a_1 \binom 32 + a_2 \binom 33 &= 9 \\ \sum_{x=1}^3 &= a_1 \binom 42 + a_2 \binom 43 + a_3 \binom 44 &= 36 \\ \end{aligned} \]

这就是一个下三角矩阵,每一次扫一遍即可。

代码也非常简单,常数比第一种方法小很多:

void get_coefficient(int k, int * ccts) {
    int sum = 0;
    for (int n = 1; n <= k; ++n) {
        sum += qpow(n, k, MOD);

        int rest = sum;
        // 由于我们已经知道了前 (n-1) 个系数,直接通过总和一一减去即可。
        for (int i = 1; i < n; ++i) {
            // 注意 k < MOD,所以此处不需要Lucas
            (rest -= ccts[i] * C(n + 1, i + 1) % MOD) %= MOD;
        }
        if (rest < 0) rest += MOD;
        // 明显可知,C(n, n) = 1,所以剩下的即是系数
        ccts[n] = rest;
    }
}

核心部分也非常简单,只是模数较小,需要用到 \(Lucas\) 定理。

int ccts[K][K]; // 用于保存系数
void work() {
    int T, n, k;
    cin >> T;

    while (T--) {
        cin >> n >> k;

        int * cctk = ccts[k];
        if (!cctk[1]) // 其实不难发现,a1 一定为 1,所以借此判断即可
            get_coefficient(k, cctk);

        int ans = 0;
        for (int i = 1; i <= k; ++i)
            (ans += cctk[i] * Lucas(n + 1, i + 1)) %= MOD;
        cout << ans << '\n';
    }
}

标签:系数,求和,题解,sum,无所畏惧,int,公式,binom,aligned
From: https://www.cnblogs.com/jeefy/p/17277029.html

相关文章

  • Arduino 外接 DS3132 读数为2165/165/165问题解决
    即使SCL/SDA不接线,DS3132也会返回,这个值为2165/165/165因此问题的来源为接线不牢靠。接线牢靠的标准:RTC模块(ZS-042)上的PWR灯应该常亮,并且亮度很大(我一开始接线,PWR亮度小,而且闪烁)RTC的SCL接Arduino的A4,SDA接Arduino的A5.The165indicatesthatthedatalinefor......
  • CF629C题解
    CF629C这里更容易进入且有翻译题意给定长度为\(m\)的仅含(和)的字符串,为其左右补上两个字符串使其达到指定长度\(n\)且合法,需补足字符串合计长度\(n-m\)满足\(n-m\le2000\)。解析字符串合法条件为:左右括号总数相等;从左数起在任意位置上左括号数量不小......
  • [ARC128D] Neq Neq 题解
    不难考虑设\(f_i\)表示现在处理了前\(i\)个数,第\(i\)个数必选得到的方案数。由于\(a_n\)不可能被删掉(需要一个\(a_{n+1}\)),所以答案即为\(f_n\)。对\(f_i\),我们考虑前一个被保留的数\(j\),问题转化成被\(i,j\)夹住的一段连续的数可不可以全部删掉,分类讨论:\(j=i-1\)......
  • 洛谷9150题解
    考虑把\(i\tok_i\)连边,这样形成若干个环。考虑断环为链并且把链复制一份接到后面。考虑求出从一个点集开始拓展能够到达的点集\(S1_i\)。显然\(S1_i\)在环上是连续的,设\(r_i\)表示第\(i\)个节点拓展能得到的右端点。考虑每个节点\(i\)所在强连通分量的点集合\(S2\)。可以证明\(......
  • 省选欢乐赛 题解
    昨天沈老师神仙场整不会了。然后今天经典老题。不是很懂为什么三道题题目名称都是Delov。卷王发现如果答案为第\(t\)秒,那么这个序列一定是一个\(1\)、两个连续的\(1\)、三个连续的\(1\)……一直到\(t\)个连续的\(1\)(中间可能有没有的项,即不操作)异或起来。那随便跑个状......
  • php 浮点数转int精度丢失问题解决办法
    方案一:先将浮点金额strval后再转int。(推荐)$param['order_price']=intval(strval($param['order_price']*100)); 方案二: echoround(19.99*100); 这种方案出来是......
  • P4156 [WC2016]论战捆竹竿 题解
    题目链接题意描述给定一个字符串\(S\),你初始拥有一个空串\(T\),每次可以选择这个字符串的一个Border,去掉它后接在\(T\)的后面,操作后\(S\)不变,给出一个上限\(w\),求......
  • CF1295E Permutation Separation 题解 线段树优化dp
    题目链接:https://codeforces.com/problemset/problem/1295/E题目大意:将排列\(p_1,p_2,\ldots,p_n\)先分成\(p_1,\ldots,p_k\)与\(p_{k+1},\ldots,p_n\)两个......
  • 【题解】[HEOI2013]SAO
    题目分析:考虑这是一个树形图,所以就先直接当作树来做。这个题其实就是让我们求解有多少种拓扑序而且题目中边方向的限制其实就是在限制拓扑序的前后,而一般这种题在设计\(......
  • 【题解】Codeforces Round 861(CF1808)A - E1
    我忘记了今天有阳间CF,所以就开打的很晚,所以只是说一下做法,代码实现....还是算了吧。但是我也看了,我的思路其他的人都有写,所以这个做法正确性没问题。A.LuckyNumbers题......