【题意】给定k<=123,a,n,d<=10^9,求:

$$f(n)=\sum_{i=0}^{n}\sum_{j=1}^{a+id}\sum_{x=1}^{j}x^k$$

【算法】拉格朗日插值

【题解】参考:拉格朗日插值法及应用 by DZYO

虽然式子很复杂,但一点一点化简有条理的化简后就可以做了。

首先最后是一个自然数幂和:

$$\sum_{x=1}^{j}x^k$$

这是一个k+1次多项式,可以理解为k+一个Σ(一般一个Σ增加一次项)。

然后会发现最后部分和第二部分之间不需要插值,因为第二部分的前若干小项的计算只需要第一部分的前若干小项,那么:

$$g(m)=\sum_{j=1}^{m}\sum_{x=1}^{j}x^k$$

这是一个k+2次多项式,对g(m)可以O(k)计算前k+2项,因为后面的自然数幂和与j无关,所以可以处理成前缀和(不过对最终复杂度没有意义)。

剩余的部分:

$$f(n)=\sum_{i=0}^{n}g(a+id)$$

这是一个k+3次多项式,强制插值。对于前k+3项,每一项需要O(k)的插值运算,复杂度O(k^2)。

从这道题可以看出相邻插值嵌套的计算是O(k^2),而且适用于多层嵌套复杂度不变。

这道题有一点比较坑,模数*2会爆int,要使用unsigned int。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define int unsigned int
using namespace std;
const int maxn=,MOD=;
int f[maxn],g[maxn],a,b,k,n,mx,fac[maxn],fav[maxn];
int M(int x){return x>=MOD?x-MOD:x;}
int power(int x,int k){int ans=;while(k){if(k&)ans=1ll*ans*x%MOD;x=1ll*x*x%MOD;k>>=;}return ans;}
int calc(int *g,int u){
if(u<=mx)return g[u];//?
int v=;
for(int i=;i<=mx;i++)v=1ll*v*(u-i+MOD)%MOD;
int ans=;
for(int i=;i<=mx;i++){
int t=1ll*fav[i-]*fav[mx-i]%MOD;
if((mx-i)&)t=M(MOD-t);
ans=M(ans+1ll*g[i]*v%MOD*power(M(u-i+MOD),MOD-)%MOD*t%MOD);
}
return ans;
}
#undef int
int main(){
#define int unsigned int
int T;scanf("%d",&T);
fac[]=;for(int i=;i<=;i++)fac[i]=1ll*fac[i-]*i%MOD;
fav[]=power(fac[],MOD-);for(int i=;i>=;i--)fav[i-]=1ll*fav[i]*i%MOD;
while(T--){
scanf("%d%d%d%d",&k,&a,&n,&b);mx=k+;
g[]=;
for(int i=;i<=mx;i++){
g[i]=g[i-];
for(int j=;j<=i;j++){
g[i]=M(g[i]+power(j,k));
}
}
f[]=calc(g,a);//!!!
for(int i=;i<=mx;i++){
f[i]=M(f[i-]+calc(g,M(a+1ll*i*b%MOD)));
}
printf("%d\n",calc(f,n));
}
return ;
}

【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(插值+推式子)

    题面传送门 首先根据我们刚学插值时学的理论知识,\(f(i)\) 是关于 \(i\) 的 \(k+1\) 次多项式.而 \(g(x)\) 是 \(f(x)\) 的前缀和,根据有限微积分那一套理论,\( ...

  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. 【BZOJ】2655: calc 动态规划+拉格朗日插值

    [题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...

  7. bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...

  8. BZOJ.5339.[TJOI2018]教科书般的亵渎(拉格朗日插值) & 拉格朗日插值学习笔记

    BZOJ 洛谷 题意的一点说明: \(k\)次方这个\(k\)是固定的,也就是最初需要多少张亵渎,每次不会改变: 因某个怪物死亡引发的亵渎不会计分. 不难发现当前所需的张数是空格数+1,即\(m+1\ ...

  9. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

随机推荐

  1. 10th 本周工作量及进度统计

    本周PSP C(类别) C(内容) S(开始时间) ST(结束时间) I(中断时间) T(实际时间) 文档 11月22日 规格说明书练习 10:23­ 15:30 132 175 11月23日 知识点 ...

  2. 抽奖系统 random()

    random() 方法可返回介于 0 ~ 1 之间的一个随机数. document.write(parseInt(10*Math.random())); //输出0-10之间的随机整数document ...

  3. jion()说明

    转自:http://www.cnblogs.com/skywang12345/p/3479275.html jion(),只有当子线程执行完了,主线程才会执行 1. join()介绍 join() 定 ...

  4. Ubuntu和Windows相互共享文件夹

    一.Ubuntu访问Windows共享文件夹 1.对需要共享文件夹右击->属性->共享 2.选择要与其共享的用户,选择好用户点击有点添加按钮添加,然后点击下方的共享按钮 3.完成共享 4. ...

  5. BZOJ3512 DZY Loves Math IV(杜教筛+线性筛)

    注意到n很小,考虑枚举i.现在要求的是f(n,m)=Σφ(in) (i=1~m).显然当n没有平方因子时,φ(in)=φ(i)·φ(n/gcd(i,n))·gcd(i,n).利用φ*1=id又可得φ( ...

  6. 命令行Scp的使用----远程拷贝文件

    1.用CRT分别连上两台需要传输文件的linux系统服务器,并检查防火墙是否关闭. 查看防火墙状态: /etc/init.d/iptables status 若防火墙启用,暂时关闭防火墙: /etc/ ...

  7. BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】

    题目链接 BZOJ2437 题解 和JSOI2014很像 只不过这题动态删点 如果我们把空位置看做\(X\)的话,就会发现我们走的路径是一个\(OX\)交错的路径 然后将图二分染色,当前点必胜,当且仅 ...

  8. 《Linux内核设计与实现》第3章读书笔记

    第三章 进程管理 一.进程 1.进程就是处于执行期的程序,但并不局限于可执行代码.实际上,进程是正在执行的程序代码的实时结果. 2.执行线程是在进程中活动的对象 每个线程拥有一个独立的计数器.进程栈. ...

  9. hibernate的懒加载

    WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...

  10. pycharm配置总结

    1. 快捷键 格式化代码:Ctrl + Alt + L 2. A scheme with this name already exists or was deleted without applyin ...