正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229


题目大意

给出\(n,k,r\)求

\[\sum_{i=1}^ni^kr^i
\]

\(1\leq T\leq 20,1\leq n,r\leq 10^{18},1\leq k\leq 2000\)


解题思路

如此明显的式子直接开推

\[S_k=\sum_{i=1}^ni^kr^i,rS_k=\sum_{i=2}^{n+1}(i-1)^kr^i
\]
\[(r-1)S_k=n^kr^{n+1}-r+\sum_{i=2}^n\left((i-1)^k-i^k\right)r^i
\]

二项式展开\((i-1)^k\)

\[(r-1)S_k=n^kr^{n+1}-r+\sum_{i=2}^n\sum_{j=0}^{k-1}(-1)^{k-j}\binom{k}{j}r^i
\]

然后把\(j\)提到前面去

\[(r-1)S_k=n^kr^{n+1}-r+\sum_{j=0}^{k-1}(-1)^{i-j}\binom{k}{j}\sum_{i=2}^nr^i
\]
\[\Rightarrow S_k=\frac{n^kr^{n+1}-r+\sum_{j=0}^{k-1}(-1)^{k-j}\binom{k}{j}(S_j-r)}{r-1}
\]

这样\(S_k\)就可以\(O(k^2)\)递推了。

当然当\(r=1\)的时候,不能再使用这个公式,此时\(\sum_{i=1}^ni^k\)是很经典的问题,直接拉格朗日插值插出一个\(k+1\)次多项式即可。

此题到这里就圆满结束了,但是以直觉判断上面那个式子可以卷积,拆开组合数然后疯狂跳步一下就是

\[(r-1)\frac{S_k-r}{k!}=n^kr_{n+1}-r-(r-1)\frac{r}{k!}+\sum_{j=0}^{k-1}\frac{(-1)^{k-j}}{(k-j)!}\frac{S_j-r}{j!}
\]

\[H(x)=\sum_{i=0}^\infty (n^ir_{n+1}-r-(r-1)\frac{r}{i!})x^i
\]
\[G(x)=\sum_{i=0}^\infty \frac{S_i-r}{i!},F(x)=\sum_{i=1}^{\infty}\frac{(-1)^i}{i!}
\]

那么有

\[(r-1)G(x)=H(x)+F(x)G(x)
\]
\[\Rightarrow G(x)=\frac{H(x)}{r-1-F(x)}
\]

然后多项式求逆即可,时间复杂度\(O(k\log k)\),虽然这题的模数不能用,但是可以顺便解决掉序列求和V5

但是最近写的多项式求逆有点多,咕了,所以上面的式子如果有错我也没办法(((、


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2100,P=1e9+7;
ll T,n,k,r,inv[N],fac[N],pre[N],suf[N],s[N];
ll power(ll x,ll b){
ll ans=1;b%=P-1;x%=P;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
ll C(ll n,ll m)
{return fac[n]*inv[m]%P*inv[n-m]%P;}
signed main()
{
scanf("%lld",&T);
inv[0]=fac[0]=inv[1]=1;
for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;
for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;
while(T--){
scanf("%lld%lld%lld",&n,&k,&r);r%=P;
if(r==1){
ll ans=0;k+=2;n%=P;
pre[0]=suf[k+1]=1;
for(ll i=1;i<=k;i++)pre[i]=pre[i-1]*(n-i)%P;
for(ll i=k;i>=1;i--)suf[i]=suf[i+1]*(n-i)%P;
for(ll i=1,p=0;i<=k;i++){
p=(p+power(i,k-2))%P;
(ans+=p*pre[i-1]%P*suf[i+1]%P*inv[i-1]%P*(((k-i)&1)?P-inv[k-i]:inv[k-i])%P)%=P;
}
printf("%lld\n",(ans+P)%P);
}
else{
ll z=power(r,n+1),invr=power(r-1,P-2);
s[0]=(z-r+P)*invr%P;n%=P;
for(ll i=1,pw=n;i<=k;i++,pw=pw*n%P){
s[i]=(z*pw-r+P)%P;s[i-1]=(s[i-1]-r+P)%P;
for(ll j=0;j<i;j++)
(s[i]+=(((i-j)&1)?(P-1):(1))*s[j]%P*C(i,j)%P)%=P;
s[i]=s[i]*invr%P;
}
printf("%lld\n",(s[k]+P)%P);
}
}
return 0;
}

51nod1229-序列求和V2【数学,拉格朗日插值】的更多相关文章

  1. 51nod1229 序列求和 V2

    这题...毒瘤吧,可能要写两份代码... 传送门 noteskey 我们考虑这里的复杂度肯定是与 k 相关的,而且平方也是没问题的,那么我们先看看 S(k) 能怎么得到: \[\begin{align ...

  2. 51nod1229 序列求和 V2 【数学】

    题目链接 B51nod1229 题解 我们要求 \[\sum\limits_{i = 1}^{n}i^{k}r^{i}\] 如果\(r = 1\),就是自然数幂求和,上伯努利数即可\(O(k^2)\) ...

  3. 【BZOJ2655】calc DP 数学 拉格朗日插值

    题目大意 ​ 一个序列\(a_1,\ldots,a_n\)是合法的,当且仅当: ​ 长度为给定的\(n\). ​ \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. ​ \(a_1, ...

  4. [51nod]1229 序列求和 V2(数学+拉格朗日差值)

    题面 传送门 题解 这种颓柿子的题我可能死活做不出来-- 首先\(r=0\)--算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\) 设 \[s_p ...

  5. 【BZOJ】2655: calc 动态规划+拉格朗日插值

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

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

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

  7. 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值

    题目大意 ​ 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...

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

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

  9. 51nod 1258 序列求和 V4

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1258 1258 序列求和 V4  基准时间限制:8 秒 空间限制:131 ...

随机推荐

  1. Centos7上yum安装mongodb4-2

    vim /etc/yum.repos.d/mongodb-org-4.2.repo [mongodb-org-4.2] name=MongoDB Repository baseurl=https:// ...

  2. 转:C语言自增自減问题总结

    C语言自增自減问题总结 在程序设计中,经常遇到"i=i+1"和"i=i-1"这两种极为常用的操作.C语言为这种操作提供了两个更为简洁的运算符,即++和--,分别 ...

  3. SpringBoot笔记(5)

    一.Web原生组件注入 1.使用Servlet API @ServletComponentScan(basePackages = "com.atguigu.admin") :指定原 ...

  4. win+R 中的命令

    cmd------CMD命令提示符 MSConfig------系统配置实用程序 regedit------注册表编辑器 notepad------打开记事本 calc------启动计算器 msts ...

  5. pip install 报错 TypeError: 'module' object is not callable

    $ pip install filetype Traceback (most recent call last): File "/usr/local/bin/pip2", line ...

  6. JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )

    题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...

  7. IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流

    因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...

  8. Python - 如何将 list 列表作为数据结构使用

    列表作为栈使用 栈的特点 先进后出,后进先出 如何模拟栈? 先在堆栈尾部添加元素,使用 append() 然后从堆栈顶部取出一个元素,使用 pop() # 模拟栈 stack = [1, 2, 3, ...

  9. jvm学习笔记:栈帧

    栈帧内的数据结构 局部变量表(Local Variables):记录非静态方法的this指针.方法参数.局部变量 操作数栈(Operand Stack):用于计算的栈结构 动态链接(Dynamic L ...

  10. Apache Hudi内核之文件标记机制深入解析

    1. 摘要 Hudi 支持在写入时自动清理未成功提交的数据.Apache Hudi 在写入时引入标记机制来有效跟踪写入存储的数据文件. 在本博客中,我们将深入探讨现有直接标记文件机制的设计,并解释了其 ...