传送门

解题思路

  比较经典的一道题目。第一种方法是差分,就是假设\(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. mongodb的学习 (3)

    聚合函数 - 添加基础数据:db.local.save({contry:'中国',name:'小明',score:77});db.local.save({contry:'中国',name:'小红',s ...

  2. ( vant ) 新手踩坑

    最近在用vant 做H5 页面,坑太他娘的坑娘啊!!!!!!!!!!!!!!!! 1,修改vant组件样式问题 vant 修改组件的样式时,在scoped 属性下没有效果.如果去掉scope 会造成全 ...

  3. 64 计算机图形学入门(1)——OpenGL环境配置与图形流水线(图像管线)

    0 引言 最近想学一下计算机图形学方面的知识,原因如下.目前本人接触了数字图像处理(opencv)以及点云处理(PCL)方面的知识,对从图像和点云中提取特征信息,并将特征转化为底层/中层语义信息有了一 ...

  4. Go语言中接口组合的实现方法

    在Go语言中,可以在接口A中组合其它的一个或多个接口(如接口B.C),这种方式等价于在接口A中添加接口B.C中声明的方法. 代码如下: //接口中可以组合其它接口,这种方式等效于在接口中添加其它接口的 ...

  5. bootstrap 的 datetimepicker,同时有日期和时间, 且开始时间要早于结束时间

    首先,引入jquery, bootstrap 和 bootstrap-datetimepicker datetimepicker的下载地址: http://www.bootcss.com/p/boot ...

  6. ASP.NET Core学习——4

    静态文件 静态文件(static files),例如HTML.CSS.图片和JavaScript之类的资源会被ASP.NET Core应用直接提供给客户端. 静态文件通常位于web root(< ...

  7. Linux的初始页表

    LOWMEM,是相对于HIGHMEM而言,其实就是内核态直接映射的物理内存空间的大小,一般为896MB. 这里只是粗略地估计了一下,取1GB. LOWMEM_PAGES代表了LOWMEM区域对应了多少 ...

  8. 词表征 1:WordNet、0-1表征、共现矩阵、SVD

    原文地址:https://www.jianshu.com/p/c1e4f42b78d7 一.基于知识的表征 参见图1.1,WordNet中包含同义词集(synonym sets)和上位词(hypern ...

  9. Rollei SL66 使用说明

    根据记忆,并用不规范的语言描述我对sl66的使用心得:一.上卷1.用摇把顺时针转到12点位置,再退回3点位置:2.安插刀:3.后背上方按钮向右拨,打开后背:4.取出,装卷,再放入:5.转动后背上旋钮, ...

  10. CSS3:FlexBox的详解

    Flexbox是Flexible box 的简称(灵活的盒子容器),是CSS3引入的新的布局模式.它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来. 它之所以被称为 Fl ...