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

设$f$的次数为$d$,对$d$归纳

当$d=0$时,取$g(n)=\dfrac{f(0)}{q-1}$可使其成立

假设当$d=k-1$时,命题成立

当$d=k$时,有$S(n)=\sum\limits_{i=0}^{n-1}f(i)q^i$和$qS(n)=\sum\limits_{i=0}^{n-1}f(i)q^{i+1}=\sum\limits_{i=1}^nf(i-1)q^i$

将两式相减,得到$(q-1)S(n)=f(n-1)q^n-f(0)+\sum\limits_{i=1}^{n-1}\left[f(i-1)-f(i)\right]q^i$

因为$f(i-1)-f(i)$是一个$k-1$次多项式,所以$\sum\limits_{i=0}^{n-1}\left[f(i-1)-f(i)\right]q^i$可以被表示为$q^nh(n)-h(0)$,其中$h(x)$是一个次数$\leq k-1$的多项式

代回原式继续处理

$\begin{align*}(q-1)S(n)&=f(n-1)q^n-f(0)+q^nh(n)-h(0)\\S(n)&=q^n\dfrac{f(n-1)+h(n)}{q-1}-\dfrac{f(0)+h(0)}{q-1}\end{align*}$

令$F(n)=\dfrac{f(n-1)+h(n)}{q-1},c=\dfrac{f(0)+h(0)}{q-1}$,那么原式变为$S(n)=q^nF(n)-c$

因为$S(0)=0$,所以$F(0)-c=0$,即$c=F(0)$

而$F(n)$是一个$k$次多项式(含$f$)

所以当$d=k$时,命题成立

有了这个定理,我们可以做一番推导

一方面,由$S(n)$的定义,$S(n)-S(n-1)=q^{n-1}f(n-1)$,另一方面,由上述定理,$S(n)-S(n-1)=q^ng(n)-q^{n-1}g(n-1)$,联立起来我们可以得到$qg(n)=f(n-1)+g(n-1)$

如果我们知道了$g(0)$,那么$g(1)\cdots g(k+1)$都可求得

不妨设$g(0)$为一个未知数,那么$g(1)\cdots g(k+1)$都是关于$f(0)$的一次函数

另一方面,$k$次多项式$g(x)$的$k+1$阶差分等于$0$,即$\triangle^{k+1}g(x)=\sum\limits_{i=0}^{k+1}(-1)^i\binom{k+1}ig(x-i)=0$

代入$k+1$,我们得到$\sum\limits_{i=0}^{k+1}(-1)^i\binom{k+1}ig(k+1-i)=0$,它是关于$g(0)$的一元一次方程,直接解即可

于是我们得到了$g(0)\cdots g(k+1)$,使用线性插值的技巧,我们可以做到在$O(k)$的时间内求出$g(n)$

关于线性插值,这里不展开讲,只放一个miskcoo的博客和公式(推荐去看他的博客,推导过程挺好玩的)

设$k$次多项式为$P(x)$,已经知道$P(0)\cdots P(k)$,则$P(x)=\sum\limits_{j=0}^k(-1)^{k-j}\binom xj\binom{x-j-1}{k-j}P(j)$

第一个组合数预处理,第二个组合数从大到小枚举$j$的时候迭代计算

于是这道题就做完了,总复杂度$O(k)$,真是奇妙

#include<stdio.h>
typedef long long ll;
const int mod=1000000007;
int mul(int a,int b){return a*(ll)b%mod;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
ll n;
int k,q,invq,fac[500010],rfac[500010],inv[500010],f[500010],G[500010],cn[500010];
int C(int n,int k){return mul(fac[n],mul(rfac[n-k],rfac[k]));}
int pow(int a,ll b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
struct single{
	int x,c;
	single(int a=0,int b=0){x=a;c=b;}
}g[500010],s;
single operator+(single a,single b){return single(ad(a.x,b.x),ad(a.c,b.c));}
single operator+(single a,int b){return single(a.x,ad(a.c,b));}
single operator*(single a,int b){return single(mul(a.x,b),mul(a.c,b));}
int main(){
	int i,t,c,gn;
	scanf("%lld%d%d",&n,&k,&q);
	for(i=0;i<=k;i++)scanf("%d",f+i);
	fac[0]=1;
	for(i=1;i<=k+1;i++)fac[i]=mul(fac[i-1],i);
	rfac[k+1]=pow(fac[k+1],mod-2);
	for(i=k+1;i>0;i--)rfac[i-1]=mul(rfac[i],i);
	for(i=1;i<=k+1;i++)inv[i]=mul(rfac[i],fac[i-1]);
	g[0].x=1;
	invq=pow(q,mod-2);
	for(i=1;i<=k+1;i++)g[i]=(g[i-1]+f[i-1])*invq;
	t=1;
	for(i=0;i<=k+1;i++){
		s=s+((g[k+1-i]*C(k+1,i))*t);
		t=-t;
	}
	G[0]=mul(-s.c,pow(s.x,mod-2));
	for(i=1;i<=k;i++)G[i]=mul(ad(G[i-1],f[i-1]),invq);
	cn[0]=1;
	n++;
	for(i=0;i<k;i++)cn[i+1]=mul(cn[i],mul((n-i)%mod,inv[i+1]));
	c=1;
	t=1;
	gn=0;
	for(i=k;i>=0;i--){
		gn=ad(gn,mul(mul(G[i],cn[i]),mul(t,c)));
		t=-t;
		c=mul(c,mul((n-i)%mod,inv[k-i+1]));
	}
	gn=de(mul(pow(q,n),gn),G[0]);
	if(gn<0)gn+=mod;
	printf("%d",gn);
}

[Contest20180316]Mythological IV的更多相关文章

  1. 【XSY2751】Mythological IV 线性插值

    题目描述 已知\(f(x)\)为\(k\)次多项式. 给你\(f(0),f(1),\ldots,f(k)\),求 \[ \sum_{i=1}^nf(i)q^i \] \(k\leq 500000,n\ ...

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

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

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

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

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

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

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

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

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

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

  7. hdu 1029 Ignatius ans the Princess IV

    Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32767 K ( ...

  8. Combination Sum | & || & ||| & IV

    Combination Sum | Given a set of candidate numbers (C) and a target number (T), find all unique comb ...

  9. zoj Treasure Hunt IV

    Treasure Hunt IV Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is exploring the wonderland ...

随机推荐

  1. SCOI 股票交易 单调队列优化dp

    这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...

  2. EditPlus直接连接Linux服务器编辑文本文件

    填写好:描述,ip地址,用户名,密码, 然后点下面的高级选项: 然后返回上一个页面,继续 确定 OK: 然后,在主界面左侧点倒三角: 就可以选择我们之前配置的远程服务器地址,弹出提示框 点确定, 就连 ...

  3. Fabric证书解析

    一.证书目录解析   通过cryptogen生成所有证书文件后,以peerOrgannizations的第一个组织树org1为例,每个目录和对应文件的功能如下:   ca: 存放组织的根证书和对应的私 ...

  4. 生日蛋糕 POJ - 1190

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...

  5. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

  6. MyBatis的SQL语句映射文件详解(三)----多参数传递的几种方式

    1.单一基本类型参数(String,int等) 单一的基本类型参数,将对应语句中的parameterType的值与参数的类型相同.然后直接 用“#{参数名}” 来获取 java代码 //String类 ...

  7. bzoj1862: [Zjoi2006]GameZ游戏排名系统

    Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...

  8. DotNet 学习笔记 应用状态管理

    Application State Options --------------------------------------------------------------------- *Htt ...

  9. 160多条Windows 7 “运行”命令

    160多条Windows 7 “运行”命令: 删除或更改应用程序 = control appwiz.cpl 添加设备 = devicepairingwizard  蓝牙文件传输 = fsquirt  ...

  10. linux C 中的volatile使用【转】

    转自:http://blog.csdn.net/sukhoi27smk/article/details/38020583 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器 ...