传送门

解题思路

  比较经典的一道题目。第一种方法是差分,就是假设\(k=3\),我们打一个表。

0 1 9 36 100 225
1 8 27 64 125
7 19 37 61
12 18 24
6 6

  表中第一行为所要求的前缀和,后面的\(f[i][j]=f[i-1][j]+f[i-1][j-1]\),就是每个数字等于上面的数字\(-\)左上的数字,减到最后发现只剩一样的数字。此时第一行的后面的所有数字只与后面每一行的第一个数字有关,而且系数恰好是一个组合数。比如说我们要算第一行第\(10\)个数字,也就是\(n=10\)的时候的答案。那么

\[ans=C(10,1)*1+C(10,2)*7+C(10,3)*12+C(10,4)*6
\]

  这个的证明可以根据实际意义来,从第二行第一个数字到第一行第十个数字一共走\(10\)步,期中\(1\)步向上走,那么就为\(C(10,1)\)。

  所以我们暴力算出前\(k+1\)项的值,然后递推即可。差分法的时间复杂度为\(O(k^2)\)的,无法通过此题。但是这个思想值得学习。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define int long long using namespace std;
const int MAXN = 1005;
const int MOD = 1e9+7; int n,k,inv[MAXN],fac[MAXN];
int f[MAXN][MAXN],ans; inline int fast_pow(int x,int y){
int ret=1;
for(;y;y>>=1){
if(y&1) ret=ret*x%MOD;
x=x*x%MOD;
}
return ret;
} inline int C(int n,int m){
return fac[n]*inv[m]%MOD*inv[n-m]%MOD;
} signed main(){
scanf("%lld%lld",&n,&k);fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%MOD;inv[n]=fast_pow(fac[n],MOD-2);
for(int i=n-1;~i;i--) inv[i]=inv[i+1]*(i+1)%MOD;
for(int i=1;i<=k+1;i++) f[0][i]=f[0][i-1]+fast_pow(i,k),f[0][i]%=MOD;
if(n<=k+1) {printf("%lld\n",f[0][n]);return 0;}
for(int i=1;i<=k+1;i++)
for(int j=i;j<=k+1;j++) f[i][j]=f[i-1][j]-f[i-1][j-1],f[i][j]=(f[i][j]+MOD)%MOD;
for(int i=1;i<=k+1;i++)
ans=(ans+f[i][i]*C(n,i)%MOD)%MOD;
printf("%lld\n",ans);
return 0;
}

  第二种方法自然就是拉格朗日插值法,对于一段连续的值来说,拉格朗日插值法可以在\(O(k)\)内解决,具体来说就是将定义式变形。

\[\prod\limits_{i!=j} \frac{x-x_j}{x_i-x_j}
\]

  因为带入的值是连续的,所以上面一定是两段连续的乘积,我们要维护一个前缀乘积后缀乘积拼起来。下面的话可以看成两个阶乘,正负取决于\(n-i\)的奇偶性,这样就可以\(O(n)\)的算出结果。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define int long long using namespace std;
const int MAXN = 1000005;
const int MOD = 1e9+7; int n,k,inv[MAXN],y[MAXN];
int pre[MAXN],suf[MAXN],ans,fac[MAXN]; int fast_pow(int x,int y){
int ret=1;
for(;y;y>>=1){
if(y&1) ret=ret*x%MOD;
x=x*x%MOD;
}
return ret;
} signed main(){
scanf("%lld%lld",&n,&k);
pre[0]=1;for(int i=1;i<=k+2;i++) pre[i]=pre[i-1]*(n-i)%MOD;
suf[k+3]=1;for(int i=k+2;i;i--) suf[i]=suf[i+1]*(n-i)%MOD;
fac[0]=1;for(int i=1;i<=k+2;i++) fac[i]=fac[i-1]*i%MOD;
inv[k+2]=fast_pow(fac[k+2],MOD-2);
for(int i=k+1;~i;i--) inv[i]=inv[i+1]*(i+1)%MOD;int s1,s2;
for(int i=1;i<=k+2;i++) y[i]=(y[i-1]+fast_pow(i,k))%MOD;
for(int i=1;i<=k+2;i++){
s1=pre[i-1]*suf[i+1]%MOD;
s2=inv[i-1]*inv[k+2-i]*(((k+2-i)&1)?-1:1)%MOD;
ans=((ans+s1*s2%MOD*y[i]%MOD)%MOD+MOD)%MOD;
}
printf("%lld\n",ans);
return 0;
}

CF 622F (拉格朗日插值)的更多相关文章

  1. CF 622F The Sum of the k-th Powers——拉格朗日插值

    题目:http://codeforces.com/problemset/problem/622/F 发现 sigma(i=1~n) i 是一个二次的多项式( (1+n)*n/2 ),sigma(i=1 ...

  2. CF 622 F The Sum of the k-th Powers —— 拉格朗日插值

    题目:http://codeforces.com/contest/622/problem/F 设 f(x) = 1^k + 2^k + ... + n^k 则 f(x) - f(x-1) = x^k ...

  3. Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

    The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar fo ...

  4. 常系数齐次线性递推 & 拉格朗日插值

    常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...

  5. 快速排序 and 拉格朗日插值查找

    private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...

  6. BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值

    传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...

  7. 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值

    题目大意 ​ 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...

  8. 【BZOJ2655】calc DP 数学 拉格朗日插值

    题目大意 ​ 一个序列\(a_1,\ldots,a_n\)是合法的,当且仅当: ​ 长度为给定的\(n\). ​ \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. ​ \(a_1, ...

  9. 【Luogu4781】【模板】拉格朗日插值

    [Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...

随机推荐

  1. 项目实战 - 混合式App开发

    为何要使用混合式开发? 要说为什么使用Hybrid App [混合式开发],就要先了解什么是Native App[原生程序], Web App[网站程序]. Native App 是专门针对某一类移动 ...

  2. java格式化时间 String 转Date Date转String

    ---恢复内容开始--- 时间格式化 Date类型转换成String: Date date = new Date();SimpleDateFormat sdf = new SimpleDateForm ...

  3. 【JavaWeb项目】一个众筹网站的开发(八)后台页面详细设置

    一.user.jsp改造 删除引入菜单 抽取导航栏 nav-bar.jsp,删除引入导航栏 删除引入main.jsp的到好烂 数据库里添加url 报错,url不对 没有/ url正确 action=& ...

  4. Django 自定义 admin

    为 model 自定义显示 label是这个Field如果在form中的话会显示的.而verbose_name在form中不会显示.只是作为一种说明而已 callable()   -->  是否 ...

  5. 「题解」:$Six$

    问题 A: Six 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 来写一篇正经的题解. 每一个数对于答案的贡献与数本身无关,只与它包含了哪几个质因数有关. 所以考虑二 ...

  6. 【Dart学习】-- Dart之extends && implements && with的用法与区别

    一,概述 继承(关键字 extends) 混入  mixins (关键字 with) 接口实现(关键字 implements) 这三种关系可以同时存在,但是有前后顺序: extends -> m ...

  7. JCF——工具类

  8. 2018ACM-ICPC EC-Final 现场赛I题 Misunderstanding...Missing 倒着DP

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:  很多acm群里有题面PDF了,我就不赘述了.简单说一 ...

  9. CSS:CSS 图像透明/不透明

    ylbtech-CSS:CSS 图像透明/不透明 1.返回顶部 1. CSS 图像透明/不透明 使用CSS很容易创建透明的图像. 注意:CSS Opacity属性是W3C的CSS3建议的一部分. 更多 ...

  10. (13)centos7 任务计划

    一.查看任务计划 crontab -l 查看全部任务计划列表 二.创建任务计划 1.进入计划文件 crontab -e 2.任务格式 语法: 分钟 小时 几号 月份 星期几 任务 #一共5个时间参数 ...