The Sum of the k-th Powers(Educational Codeforces Round 7F+拉格朗日插值法)
题目链接
题面

题意
给你\(n,k\),要你求\(\sum\limits_{i=1}^{n}i^k\)的值。
思路
根据数学知识或者说题目提示可知\(\sum\limits_{i=1}^{n}i^k\)可以被一个\(k+1\)次多项式表示。
由拉格朗日插值法(推荐学习博客)的公式:\(L(x)=l(x)\sum\limits_{i=1}^{k+2}y_i\frac{w_i}{x-x_i},\text{其中}l(x)=\prod\limits_{i=1}^{k+2}(x-i),y_i=\sum\limits_{j=1}^{i}j^k,w_i=\prod\limits_{j=1,j\not= i}^{n}\frac{1}{x_i-x_j}\)可以得到结果。
由于本题的特殊性,可以将\(w_i\)进行化简:
w_i&=\prod\limits_{j=1,j\not= i}^{n}\frac{1}{x_i-x_j}&\\
&=\prod\limits_{j=1,j\not= i}^{n}\frac{1}{i-j}&\\
&=\frac{1}{(i-1)(i-2)*\dots*1*(i-(i+1))\dots(i-(k+2))}&\\
&=(-1)^{k+2-i}\frac{1}{(i-1)!(k+2-i)!}&
\end{aligned}
\]
因此我们可以通过\(O(k+2)\)的复杂度得到\(l(x),y_i,x-x_i\),然后通过预处理阶乘的逆元我们可以\(O((k+2)log(k+2))\)得到\(w_i\),所以总复杂度为在\(O((k+2)log(k+2)+(k+2))\)左右。
代码实现如下
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("D://Code//in.txt","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)
const double eps = 1e-8;
const int mod = 1000000007;
const int maxn = 1e6 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int n, k, pp;
int A[maxn], y[maxn], inv[maxn], w[maxn];
int qpow(int x, int n) {
int res = 1;
while(n) {
if(n & 1) res = 1LL * res * x % mod;
x = 1LL * x * x % mod;
n >>= 1;
}
return res;
}
void init() {
A[0] = pp = 1;
for(int i = 1; i <= min(n, k + 2); ++i) {
A[i] = 1LL * A[i-1] * i % mod;
inv[i] = qpow(n - i, mod - 2);
pp = (1LL * pp * (n - i) % mod + mod) % mod;
y[i] = (y[i-1] + qpow(i, k)) % mod;
}
for(int i = 1; i <= min(n, k + 2); ++i) {
w[i] = 1LL * A[i-1] * A[k+2-i] % mod;
if((k + 2 - i) & 1) w[i] = mod - w[i];
w[i] = qpow(w[i], mod - 2);
}
}
int main() {
scanf("%d%d", &n, &k);
init();
if(n <= k + 2) return printf("%d\n", y[n]) * 0;
int ans = 0;
for(int i = 1; i <= (k + 2); ++i) {
ans = (ans + 1LL * pp * y[i] % mod * w[i] % mod * inv[i] % mod) % mod;
}
printf("%d\n", ans);
return 0;
}
The Sum of the k-th Powers(Educational Codeforces Round 7F+拉格朗日插值法)的更多相关文章
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- Educational Codeforces Round 37
Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...
- Educational Codeforces Round 5
616A - Comparing Two Long Integers 20171121 直接暴力莽就好了...没什么好说的 #include<stdlib.h> #include&l ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- Educational Codeforces Round 58 (Rated for Div. 2) 题解
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接:https://codeforces.com/contest/1101 A. Min ...
- Educational Codeforces Round 26
Educational Codeforces Round 26 困到不行的场,等着中午显示器到了就可以美滋滋了 A. Text Volume time limit per test 1 second ...
- Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code 题目链接 题意: 给出\(n\)个俄罗斯套娃,每个套娃都有一个\( ...
- Educational Codeforces Round 69 D. Yet Another Subarray Problem
Educational Codeforces Round 69 (Rated for Div. 2) D. Yet Another Subarray Problem 题目链接 题意: 求\(\sum_ ...
随机推荐
- Centos7安装部署Rabbitmq教程
依赖关系: 版本依赖一定要提前看清楚. RabbitMQ相关版本依赖关系查看 https://www.rabbitmq.com/which-erlang.html 可以看到要求版本Erlang21.3 ...
- Oracle Spatial分区应用研究之四:不同分区粒度+全局空间索引效率对比
1.实验目的 在实验之前先回答这样一个问题——对同一份数据使用不同的分区粒度,但均创建全局空间索引,问:它们的全局空间索引一致吗? 怎样算是一致的呢?R-TREE的树结构一致算一致吗?空间索引条目数及 ...
- C程序编译和执行
编译 & 执行 C 程序 首先准备一个源码文件 hello.c 键入如下代码: #include <stdio.h> int main() { /* 我的第一个 C 程序 */ p ...
- Golang 读写文件
读文件 func ReadFile_v1(filename string) { var ( err error content []byte ) fileObj,err := os.Open(file ...
- 【LEETCODE】73、根据身高重建队列 第406题
说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来 package y2019.Algorithm.greedy.medium; import java.util.Arra ...
- Python 基础 常用运算符
Python 基础 常用运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算术运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们暂只学习 算术运算. ...
- scratch少儿编程第一季——09、声音模块:吹拉弹唱我也会
各位小伙伴大家好: 上期我们学习了外观模块的指令,学会了制作特效. 本期我们来学习如何给游戏配音. 声音模块的指令不是很多,我们一起来看看吧. 首先第一个就是播放声音,里面默认插入了喵叫声. 我们点击 ...
- PTA A1017
A1017 Queueing at Bank (25 分) 题目内容 Suppose a bank has K windows open for service. There is a yellow ...
- 使用canvas实现360水球波动
代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 如何定位 golang 进程 hang 死的 bug
之前在 golang 群里有人问过为什么程序会莫名其妙的 hang 死然后不再响应任何请求.单核 cpu 打满. 这个特征和我们公司的某个系统曾经遇到的情况很相似,内部经过了很长时间的定位分析总结,期 ...