[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$的次数为$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的更多相关文章
- 【XSY2751】Mythological IV 线性插值
题目描述 已知\(f(x)\)为\(k\)次多项式. 给你\(f(0),f(1),\ldots,f(k)\),求 \[ \sum_{i=1}^nf(i)q^i \] \(k\leq 500000,n\ ...
- 用Kotlin开发Android应用(IV):定制视图和Android扩展
原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...
- DES带IV向量加密解密工具
链接:http://pan.baidu.com/s/1kVAV80J 密码:sgys 鉴于网上的DES加密解密都是不带IV向量的 我就自制了一个带IV向量的DES加密解密的小工具 © 2016-20 ...
- 人人都是 DBA(IV)SQL Server 内存管理
SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- 【故障处理】队列等待之enq IV - contention案例
[故障处理]队列等待之enq IV - contention案例 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也 ...
- hdu 1029 Ignatius ans the Princess IV
Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32767 K ( ...
- Combination Sum | & || & ||| & IV
Combination Sum | Given a set of candidate numbers (C) and a target number (T), find all unique comb ...
- zoj Treasure Hunt IV
Treasure Hunt IV Time Limit: 2 Seconds Memory Limit: 65536 KB Alice is exploring the wonderland ...
随机推荐
- CSS3学习之linear-gradient(线性渐变)
转自:http://www.cnblogs.com/rainman/p/5113242.html CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使 ...
- jaspersoft中分组打印
一:前言 使用IReport已经四个月了,最近在做一个保镖,是要按照类型分类,并且这些类型要横着打印,最后还要算这个类型金额的总值,这张报表现是说需要用到子报表,最后和一个同事一起用group来分组做 ...
- POST提交数据太大
2018.4.8号更新 其实后来最终的解决方案是修改服务器的配置文件. POST数据按道理说是没有大小限制的,只是取决于浏览器或服务器的配置,tomcat的解决方式参考方案2. ----------- ...
- noip2016 提高组
T1 玩具谜题 题目传送门 这道题直接模拟就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm&g ...
- [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...
- bzoj 1942 斜率优化DP
首先我们贪心的考虑,对于某一天来说,我们只有3中策略,第一种为不做任何行动,这时的答案与前一天相同,第二种为将自己的钱全部换成a,b货币,因为如果换a,b货币,代表在之后的某一天卖出去后会赚钱,那么当 ...
- bzoj 2753 最小生成树变形
我们根据高度建图,将无向边转化为有向边 首先对于第一问,直接一个bfs搞定,得到ans1 然后第二问,我们就相当于要求找到一颗最小生成树, 满足相对来说深度小的高度大,也就是要以高度为优先级 假设现在 ...
- 转:js中javascript:void(0) 真正含义
from:http://www.jb51.net/article/71532.htm 在Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. 我想使用过ajax的都常 ...
- 在Xcode6中搭建Python开发环境
http://jingyan.baidu.com/article/f71d60379c73001ab741d14e.html 对于使用Mac电脑,刚入门Python的同学,一定很好奇是不是可以使用Xc ...
- UVALIVE 3939 Plucking fruits
并查集解决.代码跑的有够慢.应该可以通过边权排序优化. #include <map> #include <set> #include <list> #include ...