题面传送门

首先根据我们刚学插值时学的理论知识,\(f(i)\) 是关于 \(i\) 的 \(k+1\) 次多项式。而 \(g(x)\) 是 \(f(x)\) 的前缀和,根据有限微积分那一套理论,\(g(x)\) 是关于 \(x\) 的 \(k+2\) 次多项式。注意到此题 \(k\) 数据范围不过 \(10^2\) 级别,因此我们可以考虑把 \(g\) 多项式的系数插出来。我们代入 \(k+3\) 个点值 \(1,2,3,\cdots,k+3\),预处理出 \(\prod\limits_{i=1}^{k+3}(x-i)\),这样每次相当于多项式除以二项式,可以 \(\Theta(k)\) 地计算除法运算的结果,这样我们可以在 \(\Theta(k^2)\) 的时间内计算出 \(g(x)\) 的系数。不妨设 \(g(x)=\sum\limits_{i=0}^{k+2}b_ix^i\)

下面开始推式子:

\[\begin{aligned}
ans&=\sum\limits_{i=0}^ng(a+id)\\
&=\sum\limits_{i=0}^n\sum\limits_{j=0}^{k+2}b_j(a+id)^j\\
&=\sum\limits_{j=0}^{k+2}b_j\sum\limits_{i=0}^n\sum\limits_{l=0}^ja^l(id)^{j-l}\dbinom{j}{l}\\
&=\sum\limits_{j=0}^{k+2}b_j\sum\limits_{l=0}^ja^ld^{j-l}\dbinom{j}{l}\sum\limits_{i=0}^ni^{j-l}
\end{aligned}
\]

后面一个 \(\sum\) 里的东西可以插值求出。注意本质不同的 \(j-l\) 只有 \(k+3\) 个,因此只用插 \(k+3\) 次值,总复杂度 \(\Theta(k^2)\)

const int MAXN=126;
int k,a,n,d;
int qpow(int x,int e){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int fac[MAXN+5],ifac[MAXN+5];
void init_fac(int n){
for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++) ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
}
int binom(int n,int k){return 1ll*fac[n]*ifac[k]%MOD*ifac[n-k]%MOD;}
int sum[MAXN+5],pre[MAXN+5],suf[MAXN+5],b[MAXN+5],s[MAXN+5];
int calc_sum(int n,int k){//\sum\limits_{i=0}^ni^k
if(!k) return n+1;
for(int i=1;i<=k+2;i++) sum[i]=(0ll+sum[i-1]+qpow(i,k))%MOD;
pre[0]=suf[k+3]=1;int res=0;
for(int i=1;i<=k+2;i++) pre[i]=1ll*pre[i-1]*(n-i+MOD)%MOD;
for(int i=k+2;i;i--) suf[i]=1ll*suf[i+1]*(n-i+MOD)%MOD;
for(int i=1;i<=k+2;i++){
int coef=1ll*pre[i-1]*suf[i+1]%MOD;
coef=1ll*coef*ifac[k+2-i]%MOD*ifac[i-1]%MOD;
if((k+2-i)&1) coef=MOD-coef;
res=(0ll+res+1ll*coef*sum[i])%MOD;
} return res;
}
int ff[MAXN+5];
void add(int v){
static int tmp[MAXN+5];memset(tmp,0,sizeof(tmp));
for(int i=0;i<=k+3;i++) tmp[i]=(0ll+((!i)?0:ff[i-1])-1ll*ff[i]*v%MOD+MOD)%MOD;
for(int i=0;i<=k+3;i++) ff[i]=tmp[i];
}
void div(int v){
static int tmp[MAXN+5];
memset(tmp,0,sizeof(tmp));
int iv=qpow(MOD-v,MOD-2);
for(int i=0;i<=k+3;i++){
tmp[i]=(0ll+ff[i]-((!i)?0:tmp[i-1])+MOD)%MOD;
tmp[i]=1ll*tmp[i]*iv%MOD;
}
for(int i=0;i<=k+3;i++) ff[i]=tmp[i];
// for(int i=0;i<=k+3;i++) printf("%d%c",ff[i]," \n"[i==k+3]);
}
void calc_b(){
memset(b,0,sizeof(b));
for(int i=1;i<=k+3;i++) sum[i]=(0ll+sum[i-1]+qpow(i,k))%MOD;
for(int i=1;i<=k+3;i++) sum[i]=(0ll+sum[i-1]+sum[i])%MOD;
memset(ff,0,sizeof(ff));ff[0]=1;
for(int i=1;i<=k+3;i++) add(i);
// for(int i=0;i<=k+3;i++) printf("%d%c",ff[i]," \n"[i==k+3]);
for(int i=1;i<=k+3;i++){
div(i);int mul=1;
for(int j=1;j<=k+3;j++) if(i^j) mul=1ll*mul*(i-j+MOD)%MOD;
mul=1ll*qpow(mul,MOD-2)*sum[i]%MOD;
for(int j=0;j<=k+2;j++) b[j]=(0ll+b[j]+1ll*ff[j]*mul%MOD)%MOD;
add(i);
}
}
void solve(){
scanf("%d%d%d%d",&k,&a,&n,&d);calc_b();int ans=0;
// for(int i=0;i<=k+2;i++) printf("%d%c",b[i]," \n"[i==k+2]);
for(int j=0;j<=k+2;j++) s[j]=calc_sum(n,j);
for(int j=0;j<=k+2;j++) for(int l=0;l<=j;l++){
int coef=1ll*b[j]*binom(j,l)%MOD*qpow(a,l)%MOD*qpow(d,j-l)%MOD;
ans=(0ll+ans+1ll*coef*s[j-l]%MOD)%MOD;
} printf("%d\n",ans);
}
int main(){
init_fac(MAXN);
int qu;scanf("%d",&qu);while(qu--) solve();
return 0;
}
/*
1
2 5 2 5
6755
*/

BZOJ 3453 - tyvj 1858 XLkxc(插值+推式子)的更多相关文章

  1. BZOJ.3453.tyvj 1858 XLkxc(拉格朗日插值)

    BZOJ 题意即求\[\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{x=1}^jx^k\] 我们知道最后一个\(\sum\)是自然数幂和,设\(f(n)=\sum_{x=1}^ ...

  2. 【BZOJ】3453: tyvj 1858 XLkxc 拉格朗日插值(自然数幂和)

    [题意]给定k<=123,a,n,d<=10^9,求: $$f(n)=\sum_{i=0}^{n}\sum_{j=1}^{a+id}\sum_{x=1}^{j}x^k$$ [算法]拉格朗日 ...

  3. BZOJ3453: tyvj 1858 XLkxc(拉格朗日插值)

    题意 题目链接 Sol 把式子拆开,就是求这个东西 \[\sum_{i = 0} ^n \sum_{j = 1}^{a + id} \sum_{x =1}^j x^k \pmod P\] 那么设\(f ...

  4. bzoj3453: tyvj 1858 XLkxc(拉格朗日插值)

    传送门 \(f(n)=\sum_{i=1}^ni^k\),这是自然数幂次和,是一个以\(n\)为自变量的\(k+1\)次多项式 \(g(n)=\sum_{i=1}^nf(i)\),因为这东西差分之后是 ...

  5. [BZOJ3453]tyvj 1858 XLkxc:拉格朗日插值

    分析 之前一直不知道拉格朗日插值是干什么用的,只会做模板题,做了这道题才明白这个神奇算法的用法. 由题意可知,\(f(x)\)是关于\(x\)的\(k+1\)次函数,\(g(x)\)是关于\(x\)的 ...

  6. luogu P4948 数列求和 推式子 简单数学推导 二项式 拉格朗日插值

    LINK:数列求和 每次遇到这种题目都不太会写.但是做法很简单. 终有一天我会成功的. 考虑类似等比数列求和的东西 帽子戏法一下. 设\(f(k)=\sum_{i=1}^ni^ka^i\) 考虑\(a ...

  7. bzoj 3157 && bzoj 3516 国王奇遇记——推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3157 https://www.lydsy.com/JudgeOnline/problem.p ...

  8. bzoj 3157 & bzoj 3516 国王奇遇记 —— 推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3157 https://www.lydsy.com/JudgeOnline/problem.p ...

  9. [HAOI2007]分割矩阵 DP+推式子

    发现最近好少写博客啊(其实是各种摆去了) 更一点吧 这道题要求最小化均方差,其实凭直觉来说就是要使每个块分的比较均匀一点,但是单单想到想到这些还是不够的, 首先f[i][j][k][l][t]表示以( ...

随机推荐

  1. python json中的 dumps loads函数

    一.概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行js ...

  2. 微信h5跳转小程序wx-open-launch-weapp开放标签不显示(已解决)

    前言: 前几天成功对接了跳转第三方小程序的功能,今天有个页面有需要对接.但是奇怪的是用的和上次一模一样的配置,但就是死活不显示wx-open-launch-weapp这个开放标签的按钮,看不到任何效果 ...

  3. 小白自制Linux开发板 八. Linux音频驱动配置

    不知不觉小白自制开发板系列已经到第八篇了,本篇要配置的是音频驱动,也算是硬件部分的最后一片了,积攒的文章也差不多全放完了,后续更新可能会放缓,还请见谅. 对于F1C200s是自带了多媒体处理功能的,所 ...

  4. 聊聊 Kubernetes Pod or Namespace 卡在 Terminating 状态的场景

    这个话题,想必玩过kubernetes的同学当不陌生,我会分Pod和Namespace分别来谈. 开门见山,为什么Pod会卡在Terminationg状态? 一句话,本质是API Server虽然标记 ...

  5. Swift-方法调度-类的普通方法底层探究

    1. 类的普通方法调度 写一个结构体和一个类,对比看看方法调用的方式: // 结构体 struct PersonStruct { func changClassName() {} } let s = ...

  6. Educational Codeforces Round 114 (Rated for Div. 2)题解

    还是常规的过了A,B,C还是在D上卡了... D. The Strongest Build 简化题意:给定你n组东西,每组东西都有\(c_i\)个装备,每个装备有一个武力值\(a_{i,j}\),要求 ...

  7. 访问所有HTTPS网站显示连接不安全 (火狐浏览器)

    当 Firefox 连接到一个安全的网站时(网址最开始为"https://"),它必须确认该网站出具的证书有效且使用足够高的加密强度.如果证书无法通过验证,或加密强度过低,Fire ...

  8. JAVA笔记15__TCP服务端、客户端程序 / ECHO程序 /

    /** * TCP:传输控制协议,采用三方握手的方式,保证准确的连接操作. * UDP:数据报协议,发送数据报,例如:手机短信或者是QQ消息. */ /** * TCP服务器端程序 */ public ...

  9. Java项目中集成钉钉机器人推送消息提醒

    前言: 项目中有一个需求,当有新订单产生的时候,希望能够及时通知到业务相关人员进行处理,整体考虑了一下,选用了钉钉机器人提醒功能(公司内部主要也是使用钉钉进行通讯). 操作: 主要分为两部分进行处理: ...

  10. 修改linux 两种时间的方法

    1,整理了一下怎么修改linux 两种时间的方法. 硬件时间:hwclock 或者clock,设置的方法是 hwclock --set --date="05/12/2018 12:30:50 ...