首页 > 其他分享 >[题解]CF622F The Sum of the k-th Powers

[题解]CF622F The Sum of the k-th Powers

时间:2024-06-23 13:10:39浏览次数:3  
标签:int 题解 Sum neq times prod Powers sum mod

思路

首先发现 \(\sum_{i = 1}^{n}i^k\) 是一个 \(k + 1\) 次多项式,那么我们需要求出 \(k + 2\) 个点才能得到唯一的一个 \(f(t) = \sum_{i = 1}^{t}{i^k}\)。

不难通过拉格朗日插值法,将 \(x = 1 \sim (k + 2)\) 的情况一一带入:

\[f(n) = \sum_{i = 1}^{k + 2}{((\sum_{j = 1}^{i}j^k) \times (\prod_{i \neq j}{\frac{n - x_j}{x_i - x_j}}))} \]

但是,普通的拉格朗日插值法是 \(\Theta(k^2)\),于是我们需要发掘本题中的特殊性。

可以轻易将原式转化为:

\[f(n) = \sum_{i = 1}^{k + 2}{((\sum_{j = 1}^{i}j^k) \times \frac{\prod_{i \neq j}{(n - x_j)}}{\prod_{i \neq j}{(x_i - x_j)}})} \]

发现 \(x \in [1,k + 2]\),那么容易转化:

\[f(n) = \sum_{i = 1}^{k + 2}{((\sum_{j = 1}^{i}j^k) \times \frac{\prod_{i \neq j}{(n - j)}}{\prod_{i \neq j}{(i - j)}})} \]

然后你对于 \(\prod\) 里面分数的分子、分母分别计算。

对于分子:

\[\prod_{i \neq j}{(n - x_j)} = \frac{\prod_{j = 1}^{k + 2}(n - j)}{n - i} \]

然后处理出 \(\prod_{j = 1}^{k + 2}(n - j)\) 即可。

对于分母:

\[\prod_{i \neq j}{(i - j)} = (\prod_{j = 1}^{i - 1}{j}) \times (\prod_{j = -1}^{i - k - 2}{j}) \]

定义 \(g(i) = (\prod_{j = 1}^{i - 1}{j}) \times (\prod_{j = -1}^{i - k - 2}{j})\),考虑 \(g(i)\) 与 \(g(i - 1)\) 的关系。

发现前一个 \(\prod\) 中 \(g(i)\) 比 \(g(i - 1)\) 多乘以一个 \(i - 1\),后一个 \(\prod\) 中 \(g(i)\) 比 \(g(i - 1)\) 少乘一个 \(i - k - 3\)。

因此 \(g(i) = g(i - 1) \times \frac{i - 1}{i - k - 3}\)。特别的 \(g(1) = \prod_{j = -1}^{-k - 1}j\)

将分子、分母代入原式即可。

观察到当 \(k + 2 \geq n\) 时,\(n - i\) 会被减成 \(0\),因此需要暴力 \(\Theta(n)\) 计算。

Code

#include <bits/stdc++.h>
#define re register
#define int long long
#define Add(a,b) ((((a) % mod + (b) % mod) % mod + mod) % mod)
#define Mul(a,b) ((((a) % mod) * ((b) % mod) % mod + mod) % mod)
#define Div(a,b) (Mul(a,qmi(((b) % mod + mod) % mod,mod - 2)))

using namespace std;

const int mod = 1e9 + 7;
int n,k,ans;
int mul = 1,g = 1,y;

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

inline int qmi(int a,int b){
    int res = 1;
    while (b){
        if (b & 1) res = Mul(res,a);
        a = Mul(a,a),b >>= 1;
    }
    return res;
}

inline void solve1(){
    for (re int i = 1;i <= n;i++) ans = Add(ans,qmi(i,k));
}

inline void solve2(){
    for (re int i = 1;i <= k + 2;i++) mul = Mul(mul,n - i);
    for (re int i = 1;i <= k + 2;i++){
        y = Add(y,qmi(i,k));
        if (i == 1){
            for (re int j = -1;j >= -k - 1;j--) g = Mul(g,j);
        }
        else g = Mul(g,Div(i - 1,i - k - 3));
        int a = Div(mul,n - i);
        ans = Add(ans,Mul(y,Div(a,g)));
    }
}

signed main(){
    n = read(),k = read();
    if (k + 2 >= n) solve1();
    else solve2();
    printf("%lld",ans);
    return 0;
}

标签:int,题解,Sum,neq,times,prod,Powers,sum,mod
From: https://www.cnblogs.com/WaterSun/p/18263307

相关文章

  • [题解]CF622D Optimal Number Permutation
    思路首先考虑答案下界,因为\((n-i)\)和\(|d_i+i-n|\)均大于等于\(0\),所以它们相乘一定大于等于\(0\)。于是考虑能不能构造出结果为\(0\)。显然当\(i=n\)时,无论\(d_i\)的值是什么,式子的结果为\(0\)。因此只需要考虑\(i\in[1,n)\)的情况。因为要使结果为......
  • [题解]CF609F Frogs and mosquitoes
    思路发现\(x\)对题目的限制较大,因此考虑先将\(x\)排序并离散化后再来考虑。不难用线段树维护\(\max_{i=l}^{r}\{x_i+len_i\}\),这样我们就可以利用类似线段树上二分的技巧得出是哪一只青蛙吃掉的蚊子。但是有可能有一只蚊子无法吃掉,我们先把它丢进一个集合里面。每有......
  • [题解]CF988D Points and Powers of Two
    思路首先发现选出的数最多\(3\)个,考虑反证法。假设选出了四个数\(a,b,c,d\),并令:\[|a-b|=2^{x_1},|b-c|=2^{x_2},|c-d|=2^{x_3}\]又因为,\(|a-c|,|b-d|\)也都是\(2\)的次幂,那么有\(x_1=x_2=x_3\)。于是\(|a-d|=3\times2^{x_0}\neq2^k\)。在......
  • 【VMware vSphere】使用RVTools中的PowerShell脚本创建导出vSphere环境信息的自动化任
    RVTools是VMware生态系统中一个非常受欢迎且免费的Windows实用工具,用于收集并显示VMwarevSphere环境中的相关信息,如虚拟机、主机及集群等相关配置。RVTools利用VMwarevSphereManagementSDK8.0和CISRESTAPI提供的丰富数据来直接获取和收集信息,这在管理员对VMwa......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)
    A-CountTakahashi(abc359A)解题思路遍历判断即可神奇的代码#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<map>#include<set>#include<cstring>usingnamespacestd;#defineendl'\n......
  • 精仿微信UI应用,基于SumerUI 3.0和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视
    sumer-weixin介绍精仿微信UI应用,基于SumerUI3.0和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频商城小工具等,朋友圈视频号即时聊天用于视频,商城,直播,聊天,等等场景,源码分享源码说明:本源码包只提供1.0版本,只有1.0版本是开源的,提供给大家学习研究。源码使用Hbui......
  • ABC359 G - Sum of Tree Distance
    题目链接题目大意给出一棵树,树上每个节点都有一种颜色,求所有颜色相同的节点两两之间距离的总和。 题解想来写题解主要是看了一下官方解法都写的需要“重心分解”,应该是对应中文语境下的树的点分治。实际上点分治写起来很费事,可以用启发式合并替代。具体来说,dfs时每个节点......
  • P9999 [Ynoi2000] tmostnrq 题解
    巨大难写题。就这样一个毒瘤的题,还有人把时空缩小成二分之一放在模拟赛,太好笑了。思路首先将询问离线。我们在\(l_i\)处加入这个点,在\(r_i\)处查询这个点在哪里。那么我们就需要有一个数据结构支持让所有树上的节点一起动。考虑所有点往\(x\)处动。那么对于在\(1\si......
  • LeetCode:经典题之206、92题解及延伸
    系列目录88.合并两个有序数组52.螺旋数组567.字符串的排列643.子数组最大平均数150.逆波兰表达式61.旋转链表160.相交链表83.删除排序链表中的重复元素389.找不同目录系列目录206.反转链表92.反转链表II类和结构体访问修饰符206.反转链表......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......