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_ ...
随机推荐
- Laravel实现from的curl文件转发
文件的使用curl分发时发现不能直接将其传入curl,需要使用CURLFile()来实现 分发类 <?php /** * 请求转发控制器 * Created by PhpStorm. * Use ...
- 发布你自己的Nuget包
①安装NuGetPackageExplorer 来帮助我们发布你的包. ②https://www.nuget.org/ 创建你的apikey ③新建一个asp.net的空项目,并且安装nuget.se ...
- 2019最新版Java程序员零基础入门视频教程资料(全套)
为了解决Java学习初学者在网上找视频难的事情,本人整理了一份2019年度最新版的Java学习视频教程.希望看到这份视频的你们都能找到一份称心的工作,技术上都能得到进一步的提升,好东西就要分享给你们, ...
- Python之路【第三十篇】:django 模型层-多表关系
多表操作 文件为 ----> orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr 1 php 100 人民出版社 1 ...
- Javascript判断参数类型
function (options, param) { alert(typeof options); if (typeof options == "string") { alert ...
- IDEA和Eclipse启动优化
昨天对比了下IDEA和Eclipse的启动速度,发现IDEA启动真的是好慢啊!!! 电脑配置:8G win7 IDEA启动配置 -Xms1024m -Xmx1024m -Xmn500m -XX:Met ...
- 全选全不选案例table表格
全选全不选案例table表格 案例一纯table表格 <table class="table table-bordered"> <thead class=&quo ...
- MySQL数据库之互联网常用分库分表方案
一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...
- react学习记录(三)——状态、属性、生命周期
react的状态state React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM) class Clock extends React.Compon ...
- 基于 k8s-搭建 Kubernetes 的 web 管理界面
查看我们的k8s环境是否正常: 使用kubectl get nodes 获取我们的节点的信息: 到此说明我们的kubernetes环境是正常的,接下来就可以实验了 第一步在master上传所需的软件包 ...