传送门

解题思路

  比较经典的一道题目。第一种方法是差分,就是假设\(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. loj2064[HAOI2016]找相同字符

    题意:给你两个字符串,问其中各取一个子串,有多少对相同?n<=20W. 标程: #include<bits/stdc++.h> using namespace std; typede ...

  2. PHP面向对象简易验证码类

    PHP简易验证码类 <?php class authCode { private static $instance = null; #实例对象 private $width = 120; #图片 ...

  3. 注册Bean

    <spring源码深度解析>笔记 1.给容器中注册组件 (1).包扫描+组件注解: (2).@Bean(导入第三方包里面的组件): (3).@Import给容器中快速的导入一个组件: 2. ...

  4. macOS截屏

    Command+Shift+3: 全屏幕截屏,并自动保存在桌面 Command+Shift+4: 手动截屏,并自动保存在桌面 Command+Shift+4, + Space, 之后点击程序的窗口,实 ...

  5. 分布式消息中间件(二)ActiveMQ

    一.概述 Apache出品,最流行的,能力强劲的开源消息总线. 1.JMS规范 Java消息服务(Java Message Service,即JMS)应用程序接口是一个Java平台中关于面向消息中间件 ...

  6. 【leetcode】967. Numbers With Same Consecutive Differences

    题目如下: Return all non-negative integers of length N such that the absolute difference between every t ...

  7. Unity Document

    { https://docs.unity3d.com/ScriptReference/Events.UnityEventTools.html }

  8. BZOJ 3328: PYXFIB 解题报告

    BZOJ 3328: PYXFIB 题意 给定\(n,p,k(1\le n\le 10^{18},1\le k\le 20000,1\le p\le 10^9,p \ is \ prime,k|(p- ...

  9. Code::Blocks

    Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. Code::Blocks是开放源码软件.Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库w ...

  10. Python的从头再来

    虽然各种视频,文档看了不少.但是都没有系统的总结.现在要把Python从最基础开始总结,回归.也当作自己的复习.