题目描述

  已知\(f(x)\)为\(k\)次多项式。

  给你\(f(0),f(1),\ldots,f(k)\),求

\[\sum_{i=1}^nf(i)q^i
\]

  \(k\leq 500000,n\leq {10}^{18},q\neq 1\)

题解

  当\(q=0\)时答案为\(f(0)\)

  当\(q=1\)时:记\(S(n)=\sum_{i=0}^nf(i)\),易证\(S(n)\)是一个\(k+1\)次多项式。直接求出\(S(0)\ldots S(k+1)\)然后线性插值即可。

  当\(q\neq 1\)时:记\(S(n)=\sum_{i=0}^{n-1}f(i)q^i=q^nG(n)-G(0)\),其中\(G(n)\)是一个\(k\)次多项式。

  证明:

  当\(k=0\)时显然成立。

  假设当\(k=d-1\)时成立。

  当\(k=d\)时:

\[\begin{align}
S(n)&=\sum_{i=0}^{n-1}f(i)q^i\\
qS(n)&=\sum_{i=0}^{n-1}f(i)q^{i+1}=\sum_{i=1}^nf(i-1)q^i\\
(q-1)S(n)&=f(n)q^n+\sum_{i=0}^{n-1}(f(i)-f(i-1))q^i+f(-1)
\end{align}
\]

  因为\(f(n)-f(n-1)\)是一个\(d-1\)次多项式,所以\(\sum_{i=0}^{n-1}(f(i)-f(i-1))q^i\)可以被表示成\(q^nP(n)-P(0)\)

  所以\(S(n)\)一定能被表示为\(q^nG(n)-c\),其中\(G(n)=\frac{f(n-1)+P(n)}{q-1}\),\(c\)为一个常数。

  考虑当\(n=0\)时\(S(n)=0\),所以\(c=f(0)\)

  因为\(f(n-1)\)是一个\(d\)次多项式,\(P(n)\)是一个\(d\)次多项式,所以\(G(n)\)也是一个\(d\)次多项式。

  

  现在要算\(G(n)\),可以算出\(G(0)\ldots G(k)\)之后线性插值插出来。

\[\begin{align}
S(n)&=\sum_{i=0}^{n-1}f(i)q^i\\
S(n+1)-S(n-1)&=q^{n+1}G(n+1)-q^nG(n)=f(n)q^n\\
qG(n+1)&=G(n)+f(n)\\
G(n+1)&=\frac{G(n)+f(n)}{q}
\end{align}
\]

  所以每个\(G(n)\)都可以被表示为\(a_iG(0)+b_i\)

  由于\(G(n)\)是一个\(k\)次多项式,那么就满足\(k+1\)次差分之后的值为\(0\)

\[\sum_{i=0}^{k+1}{(-1)}^{k+1-i}\binom{k+1}{i}G(i)=0
\]

  这是一个关于\(G(0)\)的一元一次方程,可以解出\(G(0)\)的值。

  然后递推得到\(G(1)\ldots G(k)\),线性插值插出\(G(n+1)\)

  时间复杂度:\(O(k+\log n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll p=1000000007;
ll n,q;
int k;
ll fp(ll a,ll b)
{
ll s=1;
for(;b;b>>=1,a=a*a%p)
if(b&1)
s=s*a%p;
return s;
}
ll inv[500010];
ll fac[500010];
ll ifac[500010];
ll f1[500010];
ll f2[500010];
ll g[500010];
ll f[500010];
ll getc(int x,int y)
{
return fac[x]*ifac[y]%p*ifac[x-y]%p;
}
ll pre[500010];
ll suf[500010];
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
scanf("%lld%d%lld",&n,&k,&q);
n++;
for(int i=0;i<=k;i++)
scanf("%lld",&f[i]);
inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;
for(int i=2;i<=k+1;i++)
{
inv[i]=-p/i*inv[p%i]%p;
ifac[i]=ifac[i-1]*inv[i]%p;
}
for(int i=2;i<=k+1;i++)
fac[i]=fac[i-1]*i%p;
ll invq=fp(q,p-2);
f1[0]=1;
f2[0]=0;
for(int i=1;i<=k+1;i++)
{
f1[i]=f1[i-1]*invq%p;
f2[i]=(f2[i-1]+f[i-1])*invq%p;
}
ll v1=0,v2=0;
for(int i=0;i<=k+1;i++)
{
v1=(v1+getc(k+1,i)*f1[i]%p*((k+1-i)&1?-1:1))%p;
v2=(v2+getc(k+1,i)*f2[i]%p*((k+1-i)&1?-1:1))%p;
}
g[0]=-v2*fp(v1,p-2)%p;
for(int i=1;i<=k+1;i++)
g[i]=(f1[i]*g[0]+f2[i])%p;
ll ans=0;
ll n2=n%p;
for(int i=0;i<=k;i++)
{
pre[i]=n2-i;
if(i)
pre[i]=pre[i-1]*pre[i]%p;
}
for(int i=k;i>=0;i--)
{
suf[i]=n2-i;
if(i!=k)
suf[i]=suf[i+1]*suf[i]%p;
}
for(int i=0;i<=k;i++)
{
ll v=g[i];
if(i)
v=v*pre[i-1]%p;
if(i!=k)
v=v*suf[i+1]%p;
v=v*ifac[i]%p;
v=v*ifac[k-i]*((k-i)&1?-1:1)%p;
ans=(ans+v)%p;
}
ans=ans*fp(q,n)%p;
ans=(ans-g[0])%p;
ans=(ans+p)%p;
printf("%lld\n",ans);
return 0;
}

【XSY2751】Mythological IV 线性插值的更多相关文章

  1. [Contest20180316]Mythological IV

    令$S(n)=\sum\limits_{i=0}^{n-1}f(i)q^i$,那么存在一个次数$\leq k$的多项式使得$S(n)=q^ng(n)-g(0)$(证明来自杜教的PPT) 设$f$的次数 ...

  2. 线性插值&双线性插值&三线性插值

    http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方 ...

  3. [转]线性插值&双线性插值&三线性插值

    转自:http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过 ...

  4. 最近邻插值法&线性插值&双线性插值&三线性插值

    最近邻插值法nearest_neighbor是最简单的灰度值插值.也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值. 造成的空间偏移误差为像素单位,计算简单,但不够精确.但当图像 ...

  5. 用Kotlin开发Android应用(IV):定制视图和Android扩展

    原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...

  6. DES带IV向量加密解密工具

    链接:http://pan.baidu.com/s/1kVAV80J  密码:sgys 鉴于网上的DES加密解密都是不带IV向量的 我就自制了一个带IV向量的DES加密解密的小工具 © 2016-20 ...

  7. 人人都是 DBA(IV)SQL Server 内存管理

    SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...

  8. leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  9. 【故障处理】队列等待之enq IV - contention案例

    [故障处理]队列等待之enq IV -  contention案例 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...

随机推荐

  1. mybatis 的sql语句及使用mybatis的动态sql mybatis防注入

    由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解.文档链接  :mybatis官方文档介绍 <!-- 根据条件查询用户 --> ...

  2. Full Regularization Path for Sparse Principal Component Analysis

    目录 背景 Notation Sparse PCA Semidefinite Relaxation Low Rank Optimization Sorting and Thresholding 背景 ...

  3. Vue $nextTick 原理

    使用场景 在进行获取数据后,需要对新视图进行下一步操作或者其他操作时,发现获取不到 DOM. 原因: 这里就涉及到 Vue 一个很重要的概念:异步更新队列(JS运行机制 . 事件循环). Vue 在观 ...

  4. 利用lnmp一键安装的php环境忘记mysql,root用户密码解决方法

    1.cd /lnmp1.5/tools/ 2.sh reset_mysql_root_password.sh 这样,即可完成修改!

  5. iOS 快速集成ijkplayer视频直播与录播框架

    最近由于需求的变动,项目内把最初最简单的原生直播框架变成了B站开源的ijkplayer框架,下面把具体的过程总结一下整个过程都比较简单,重要的是理解的过程,集成完毕之后,视频的用户体验比苹果原生好了很 ...

  6. 多线程系列之三:Immutable 模式

    一,什么是Immutable模式?immutable就是不变的,不发生改变的.Immutable模式中存在着确保实例状态不发生变化改变的类.这些实例不需要互斥处理.String就是一个Immutabl ...

  7. Ubuntu18.04安装netstat

    一.简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memb ...

  8. 使用Random类生成指定范围的随机数

    目的:要生成在[min,max]之间的随机整数 public class RandomTest { public static void main(String[] args) { ; ; Rando ...

  9. [转帖]SUSE Linux

    历经坎坷多次易主,SUSE Linux路在何方? http://blog.itpub.net/11310314/viewspace-2638811/ 之前一直理不清楚 SUSE和RedHat的关系 甚 ...

  10. 【学亮IT手记】利用字节流复制图片