题面

传送门

题解

这种颓柿子的题我可能死活做不出来……

首先\(r=0\)……算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\)

\[s_p=\sum_{i=1}^n i^pr^i
\]

我们要求的就是\(s_k\)

因为有

\[s_k=\sum_{i=1}^n i^kr^i
\]

\[rs_k=\sum_{i=2}^{n+1}r^{i}(i-1)^k
\]

两个柿子减一减

\[(r-1)s_k=r^{n+1}n^k-r+\sum_{i=2}^nr^i\left((i-1)^k-i^k\right)
\]

然后来考虑后面这个东西

\[\begin{aligned}
\sum_{i=2}^nr^i\left((i-1)^k-i^k\right)
&=\sum_{i=2}^nr^i\left(\sum_{j=0}^k{k\choose j}i^j(-1)^{k-j}-i^k\right)\\
&=\sum_{i=2}^nr^i\sum_{j=0}^{k-1}{k\choose j}i^j(-1)^{k-j}\\
&=\sum_{j=0}^{k-1}{k\choose j}(-1)^{k-j}\sum_{i=2}^nr^ii^j\\
&=\sum_{j=0}^{k-1}{k\choose j}(-1)^{k-j}\left(s(j)-r\right)\\
\end{aligned}
\]

那么就可以\(O(k^2)\)递推了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=2005,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R ll y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int fac[N],ifac[N],inv[N],Pre[N],suf[N],f[N],s[N];
ll n,r;int k,m;
inline int C(R int n,R int m){return 1ll*fac[n]*ifac[m]%P*ifac[n-m]%P;}
void init(int n=N-1){
inv[0]=inv[1]=ifac[0]=ifac[1]=fac[0]=fac[1]=1;
fp(i,2,n){
fac[i]=mul(fac[i-1],i),
inv[i]=mul(P-P/i,inv[P%i]),
ifac[i]=mul(ifac[i-1],inv[i]);
}
}
int Lagrange(){
n%=P;
fp(i,1,k+2)f[i]=add(f[i-1],ksm(i,k));
if(n<=k+2)return f[n];
m=k+2;
Pre[0]=1;fp(i,1,m)Pre[i]=mul(Pre[i-1],n-i);
suf[m+1]=1;fd(i,m,1)suf[i]=mul(suf[i+1],n-i);
int res=0,ty=(m-1)&1?P-1:1;
fp(i,1,m)res=add(res,1ll*f[i]*ty%P*Pre[i-1]%P*suf[i+1]%P*ifac[m-i]%P*ifac[i-1]%P),ty=P-ty;
return res;
}
int calc(){
if(!r)return 0;
R int p=ksm(r,n+1),q=1,invr=ksm(r-1,P-2),ty;
s[0]=mul(dec(p,r),invr),n%=P;
fp(i,1,k){
q=mul(q,n),s[i]=dec(mul(p,q),r),ty=(i&1)?P-1:1;
fp(j,0,i-1)s[i]=add(s[i],1ll*C(i,j)*ty%P*dec(s[j],r)%P),ty=P-ty;
s[i]=mul(s[i],invr);
}
return s[k];
}
int main(){
// freopen("testdata.in","r",stdin);
init();
int T;scanf("%lld",&T);
while(T--){
scanf("%lld%d%lld\n",&n,&k,&r),r%=P;
printf("%d\n",r==1?Lagrange():calc());
}
return 0;
}

[51nod]1229 序列求和 V2(数学+拉格朗日差值)的更多相关文章

  1. 51nod 1258 序列求和 V4

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

  2. 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]

    1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...

  3. 51nod 1228 序列求和(伯努利数)

    1228 序列求和  题目来源: HackerRank 基准时间限制:3 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 T(n) = n^k,S(n) = T(1 ...

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

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

  5. 51nod1229 序列求和 V2

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

  6. 51Nod 1228 序列求和

    T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k,求S(n).   例如k = 2,n = 5,S(n) = 1^2 + 2^2 + 3^2 + 4^ ...

  7. P5437-[XR-2]约定【拉格朗日差值,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/P5437 题目大意 \(n\)个点的完全图,连接\(i,j\)的边权值为\((i+j)^k\).随机选出一个生成树, ...

  8. [51nod 1822]序列求和

    \(k\leq 200000\) 考虑转化成枚举 \(k\) 的形式 我们错位相减! \[A_k=\sum_{i=1}^N i^K\times R^i \\ RA_k=\sum_{i=2}^{N+1} ...

  9. 51nod 1228 序列求和 ( 1^k+2^k+3^k+...+n^k )

    C为组合数,B为伯努利数 具体推到过程略 参考博客:http://blog.csdn.net/acdreamers/article/details/38929067# (我的式子和博客中的不一样,不过 ...

随机推荐

  1. 关于XSS漏洞的简介以及分类

    不得不说注入的时代已经过去了,最近xss貌似比较热门.我就去恶补了一下,我表示我只是菜鸟,对xss不了解.所以从最基本的学起. 什么xss漏洞? 一.XSS攻击简介 作为一种HTML注入攻击,XSS攻 ...

  2. Java面向对象-类与对象

    Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...

  3. leetcode806

    vector<int> numberOfLines(vector<int>& widths, string S) { map<char, int> MAP; ...

  4. 一卡通大冒险(hdu 2512)

    因为长期钻研算法, 无暇顾及个人问题,BUAA ACM/ICPC 训练小组的帅哥们大部分都是单身.某天,他们在机房商量一个绝妙的计划"一卡通大冒险".这个计划是由wf最先提出来的, ...

  5. linux 修改openfiles

    使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数. 新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too ...

  6. JVM中的JIT

    JVM中的JIT 介绍Java虚拟机的文章或者书籍总会提到Java虚拟机中的JIT编译器,可是JIT编译器到底是什么?为什么需要JIT编译呢? JIT编译器,是Just In Time编译的意思,又称 ...

  7. CasperJs 入门介绍

    CasperJs 是一个基于 PhantomJs 的工具,其比起 PhantomJs 可以更加方便的进行 navigation. 1.安装 CasperJS 依赖于 PhantomJS >= 1 ...

  8. solidity错误处理

    官方文档: https://solidity.readthedocs.io/en/develop/control-structures.html#error-handling-assert-requi ...

  9. win32 多线程 (五)Event

    Event是内核对象,他可以分为自动和手动两种模式. HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManual ...

  10. dev 官网

    https://www.devexpress.com/Support/Center/Example/Details/E1343 <%@ Page Language="C#" ...