传送门

解题思路

  比较经典的一道题目。第一种方法是差分,就是假设\(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. python 对redis key的基本操作

    首先看一下Python 操作redis.StrictRedis 的初始化方法__init__ def __init__(self, host='localhost', port=6379, db=0, ...

  2. 在模拟器安装测试APP,给指定设备安装APP

    1.配置好安卓环境变量,确保adb已连接且可用 2.启动模拟器,通过cmd命令行窗口 输入adb devices,出现设备信息,该设备信息是模拟器的device ID 3.进入APP的存放目录:D:\ ...

  3. Hive速览

    一.概述 Hive由Facebook开源,是一个构建在Hadoop之上的数据仓库工具 将结构化的数据映射成表 支持类SQL查询,Hive中称为HQL 1.读模式 2.Hive架构 3.使用Hive的原 ...

  4. webapp兼容问题解决

    1. IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的,玩玩会造成按钮点击延迟甚至是点击失效.这是由于区分单击事件和双击屏幕缩放的历史原因造成的, 2007年 ...

  5. 每天一个Linux命令:pwd(3)

    pwd pwd是Print Working Directory的缩写,其功能是显示当前所在工作目录的全路径.主要用在当不确定当前所在位置时,通过pwd来查看当前目录的绝对路径 格式 pwd [选项] ...

  6. Kubernetes重大漏洞?阿里云已第一时间全面修复

    近日,Kubernetes社区发现安全漏洞 CVE-2018-1002105,阿里云容器服务已在第一时间完成全面修复,敬请广大用户登录阿里云控制台升级Kubernetes版本. 目前Kubernete ...

  7. thinkphp rpc

    RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...

  8. 【dart学习】-- Dart之元数据

    一,概述 元数据概述  元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置.历 ...

  9. AcWing 156. 矩阵 (哈希二维转一维查询)打卡

    给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...

  10. int在64位操作系统中占多少位?

    仍然是32位. 曾经是这样的:16位操作系统中,int 占16位:在32位操作系统中,int 占32位.但是现在人们已经习惯了 int 占32位,因此在64位操作系统中,int 仍为32位.64位整型 ...