正题

题目链接: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. linux 下文件的权限

  2. vue2.0中模拟数据的配置

    在开发过程中,有时候接口跟不上我们的进度,我们要测试,就需要自测. 现在vue已经升级到2.0版本了,早期在vue构建工程文件在build里面有dev-server.js,但是后来构建去除了该文件集成 ...

  3. 统计学习:线性可分支持向量机(SVM)

    模型 超平面 我们称下面形式的集合为超平面 \[\begin{aligned} \{ \bm{x} | \bm{a}^{T} \bm{x} - b = 0 \} \end{aligned} \tag{ ...

  4. 新书介绍 -- 《Redis核心原理与实践》

    大家好,今天给大家介绍一下我的新书 -- <Redis核心原理与实践>. 后端开发的同学应该对Redis都不陌生,Redis由于性能极高.功能强大,已成为业界非常流行的内存数据库. < ...

  5. 项目中经常用到的sass语法汇总

    1.定义变量 使用:$(符号定义变量) 注意:使用时要带有'$'符号,定义变量的方式与PHP相同 $变量:数值; $color_r : red; div{ color:$color_r; } 2.if ...

  6. 设置rem基准值

    <script type="text/javascript"> (function(){ var docEl = document.documentElement; f ...

  7. MySQL主从复制NEW

    1.复制配置     主机一定要开启二进制日志(这里建议配置RBR)     每个主机和每个从机一定要配置一个位移的id,即server-id     每个从机配置一定要包含主机名称,日志名称,和位置 ...

  8. python opencv cv2 imshow threading 多线程

    除了线程同步,还需要注意的是「窗口处理」要放在主线程 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import threadin ...

  9. 浅谈可持久化Trie与线段树的原理以及实现(带图)

    浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...

  10. AWS扩容EC2实例根空间

    文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...