problem

给定 n , m n,m n,m,求:

∑ i = 1 n i m m i \sum_{i=1}^ni^mm^i i=1∑n​immi

BZOJ 3516: 1 ≤ n ≤ 1 0 9 , 1 ≤ m ≤ 1000 1\le n\le10^9,1\le m\le1000 1≤n≤109,1≤m≤1000。

BZOJ 4126: 1 ≤ n ≤ 1 0 9 , 1 ≤ m ≤ 5 × 1 0 5 1\le n\le10^9,1\le m\le5\times 10^5 1≤n≤109,1≤m≤5×105。


solution

BZOJ 3516:

我们设 f ( i ) = ∑ j = 1 n j i m j f(i)=\sum_{j=1}^nj^im^j f(i)=∑j=1n​jimj,用微扰法化简可以得到:

( m − 1 ) × f ( i ) = ∑ j = 1 n j i m j + 1 − ∑ j = 1 n j i m j = ∑ j = 1 n + 1 ( j − 1 ) i m j − ∑ j = 1 n j i m j = n i m n + 1 + ∑ j = 1 n m j ( ∑ k = 0 i ( i k ) j k ( − 1 ) i − k − j i ) = n i m n + 1 + ∑ k = 0 i − 1 ( i k ) ( − 1 ) i − k ∑ j = 1 n j k m j = n i m n + 1 + ∑ k = 0 i − 1 ( i k ) ( − 1 ) i − k f ( k ) \begin{aligned} (m-1)\times f(i)&=\sum_{j=1}^nj^im^{j+1}-\sum_{j=1}^nj^im^j\\ &=\sum_{j=1}^{n+1}(j-1)^im^j-\sum_{j=1}^nj^im^j\\ &=n^im^{n+1}+\sum_{j=1}^nm^j\left(\sum_{k=0}^{i}\binom i kj^k(-1)^{i-k}-j^i\right)\\ &=n^im^{n+1}+\sum_{k=0}^{i-1}\binom i k(-1)^{i-k}\sum_{j=1}^nj^km^j\\ &=n^im^{n+1}+\sum_{k=0}^{i-1}\binom i k(-1)^{i-k}f(k) \end{aligned} (m−1)×f(i)​=j=1∑n​jimj+1−j=1∑n​jimj=j=1∑n+1​(j−1)imj−j=1∑n​jimj=nimn+1+j=1∑n​mj(k=0∑i​(ki​)jk(−1)i−k−ji)=nimn+1+k=0∑i−1​(ki​)(−1)i−kj=1∑n​jkmj=nimn+1+k=0∑i−1​(ki​)(−1)i−kf(k)​

于是我们直接 O ( m 2 ) O(m^2) O(m2) d p dp dp 就可以了,答案就是 f ( m ) f(m) f(m)。

注意要特判 m = 1 m=1 m=1 的情况。

BZOJ 4126:

PS:这部分内容和上面没有什么关系。

我们设 S ( n ) = ∑ i = 0 n − 1 i m m i S(n)=\sum_{i=0}^{n-1}i^mm^i S(n)=∑i=0n−1​immi,我们要求的就是 S ( n + 1 ) S(n+1) S(n+1)。

有一个结论:存在一个 ≤ m ≤m ≤m 次的多项式 g ( x ) g(x) g(x),使得 S ( n ) = m n g ( n ) − g ( 0 ) S(n)=m^ng(n)-g(0) S(n)=mng(n)−g(0)。

证明可以参考这篇博客,我就不赘述了。

现在考虑如何求 g ( x ) g(x) g(x)。将 S ( n ) S(n) S(n) 与 S ( n − 1 ) S(n-1) S(n−1) 相减,得:

m n g ( n ) − m n − 1 g ( n − 1 ) = m n − 1 i n − 1 m^ng(n)-m^{n-1}g(n-1)=m^{n-1}i^{n-1} mng(n)−mn−1g(n−1)=mn−1in−1

所以解出来得到 g ( n ) = g ( n − 1 ) + i n − 1 m g(n)=\frac{g(n-1)+i^{n-1}}{m} g(n)=mg(n−1)+in−1​。

所以如果我们算出了 g ( 0 ) g(0) g(0),就可以不断迭代得到 g ( 1 ) , g ( 2 ) , . . . , g ( n ) g(1),g(2),...,g(n) g(1),g(2),...,g(n)。

不妨设 g ( 0 ) = x g(0)=x g(0)=x,那么其实 g ( 1 ) , g ( 2 ) , . . . , g ( n ) g(1),g(2),...,g(n) g(1),g(2),...,g(n) 可以看作是关于 x x x 的一次函数,而且可以把每个的 k k k 和 b b b 算出来。

然看考虑高阶差分的公式(不会的可以参考百度):

∑ i = 0 k + 1 ( − 1 ) i ( k + 1 i ) g ( k + 1 − i ) = 0 \sum_{i=0}^{k+1}(-1)^i\binom{k+1}{i}g(k+1-i)=0 i=0∑k+1​(−1)i(ik+1​)g(k+1−i)=0

我们就可以解出 g ( 0 ) g(0) g(0) 了,之后再用拉格朗日插值求 g ( n + 1 ) g(n+1) g(n+1) 就可以求出 S ( n + 1 ) S(n+1) S(n+1) 了。

时间复杂度 O ( m log ⁡ m ) O(m\log m) O(mlogm)。带个 log ⁡ \log log 是因为有快速幂。


code

BZOJ 3516:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
#define P 1000000007
using namespace std;
int n,m,Pow[N],fac[N],ifac[N],f[N];
int add(int x,int y)  {return x+y>=P?x+y-P:x+y;}
int dec(int x,int y)  {return x-y< 0?x-y+P:x-y;}
int mul(int x,int y)  {return 1ll*x*y>=P?1ll*x*y%P:x*y;}
int power(int a,int b,int ans=1){for(;b;b>>=1,a=mul(a,a))if(b&1)  ans=mul(ans,a);return ans;
}
void init(){Pow[0]=1,fac[0]=fac[1]=1;for(int i=1;i<N;++i)  Pow[i]=mul(Pow[i-1],n);for(int i=2;i<N;++i)  fac[i]=mul(fac[i-1],i);ifac[N-1]=power(fac[N-1],P-2);for(int i=N-2;~i;--i)  ifac[i]=mul(ifac[i+1],i+1);
}
int C(int n,int m)  {return mul(fac[n],mul(ifac[m],ifac[n-m]));}
int main(){scanf("%d%d",&n,&m),init();if(m==1)  return printf("%d",(1ll*n*(n+1)/2)%P),0;int val=power(m,n+1),inv=power(m-1,P-2);f[0]=mul(dec(val,m),inv);for(int i=1;i<=m;++i){for(int k=0;k<i;++k)f[i]=(i-k)&1?dec(f[i],mul(C(i,k),f[k])):add(f[i],mul(C(i,k),f[k]));f[i]=add(f[i],mul(Pow[i],val)),f[i]=mul(f[i],inv);}printf("%d\n",f[m]);return 0;
}

BZOJ 4126:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 500005
#define P 1000000007
using namespace std;
int n,m,up,fac[N],ifac[N],f[N],g[N],k[N],b[N];
int add(int x,int y)  {return x+y>=P?x+y-P:x+y;}
int dec(int x,int y)  {return x-y< 0?x-y+P:x-y;}
int mul(int x,int y)  {return 1ll*x*y%P;}
int power(int a,int b,int ans=1){for(;b;b>>=1,a=mul(a,a))if(b&1)  ans=mul(ans,a);return ans;
}
void init(){up=m+1,fac[0]=fac[1]=1;for(int i=2;i<=up;++i)  fac[i]=mul(fac[i-1],i);ifac[up]=power(fac[up],P-2);for(int i=up-1;~i;--i)  ifac[i]=mul(ifac[i+1],i+1);
}
int C(int n,int m)  {return mul(fac[n],mul(ifac[m],ifac[n-m]));}
int Pre[N],Suf[N];
int lagrange(int x){if(x<=up)  return g[x];int ans=0;Pre[0]=1,Suf[up+1]=1;for(int i=1;i<=up;++i)  Pre[i]=mul(Pre[i-1],x-i);for(int i=up;i>=1;--i)  Suf[i]=mul(Suf[i+1],x-i);for(int i=1;i<=up;++i){int temp=mul(g[i],mul(Pre[i-1],Suf[i+1]));temp=mul(temp,mul(ifac[i-1],(up-i)&1?(P-ifac[up-i]):ifac[up-i]));ans=add(ans,temp);}return ans;
}
int main(){scanf("%d%d",&n,&m),init();if(m==1)  return printf("%d\n",(1ll*n*(n+1)/2)%P),0;for(int i=1;i<=m;++i)  f[i]=power(i,m);k[0]=1,b[0]=0;int inv=power(m,P-2),K=0,B=0;for(int i=1;i<=up;++i)  k[i]=mul(k[i-1],inv),b[i]=mul(add(b[i-1],f[i-1]),inv);for(int i=0;i<=up;++i){K=add(K,mul((i&1)?1:P-1,mul(C(m+1,i),k[m+1-i])));B=add(B,mul((i&1)?1:P-1,mul(C(m+1,i),b[m+1-i])));}g[0]=mul(P-B,power(K,P-2));for(int i=1;i<=up;++i)  g[i]=mul(add(g[i-1],f[i-1]),inv);printf("%d\n",dec(mul(power(m,n+1),lagrange(n+1)),g[0]));return 0;
}

【BZOJ 35164126】国王奇遇记相关推荐

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

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

  2. bzoj 3157: 国王奇遇记3516: 国王奇遇记加强版

    题意 给定 n , m n,m n,m 计算 ∑ i = 1 n i m ∗ m i \sum_{i=1}^ni^m*m^i ∑i=1n​im∗mi n ≤ 1 0 9 , m ≤ 5000 n\le ...

  3. 【BZOJ3157/3516】国王奇遇记(数论)

    [BZOJ3157/3516]国王奇遇记(数论) 题面 BZOJ3157 BZOJ3516 题解 先考虑怎么做\(m\le 100\)的情况. 令\(f(n,k)=\displaystyle \sum ...

  4. 3157: 国王奇遇记 3516: 国王奇遇记加强版 - BZOJ

    果然我数学不行啊,题解君: http://www.cnblogs.com/zhuohan123/p/3726933.html 1 const 2 h=1000000007; 3 var 4 fac,f ...

  5. 无名数学题1(国王奇遇记减弱版)

    给出n,k,求出1^k+2^k+3^k+......n^k ,结果Mod 1234567891输出 (n<=10^9,k<=100) 真的是难啊...... 证明如下: 然后k^2递推就可 ...

  6. Java练习 SDUT-2737_小鑫の日常系列故事(六)——奇遇记

    小鑫の日常系列故事(六)--奇遇记 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 今天,小鑫在山上玩的时候,意外被推下 ...

  7. C语言scanf函数奇遇记

    C语言scanf函数奇遇记 作者:ocean    撰写日期:2011-11-20 博客链接:http://oceanspace.tk 看<The C Programming Language& ...

  8. exception e 是泛类吗_Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记

    引言有点长 前端的宝宝会用ajax,用异步编程到快乐的不行~ 我们java也有异步,用起来比他们还快乐~ 我们biaji一个注(gǒupí)解(gāoyào),也是快乐风男... 且看下面的栗子: 注 ...

  9. springboot异步和切面_Spring异步编程 你的@Async就真的异步吗?异步历险奇遇记

    引言有点长 前端的宝宝会用ajax,用异步编程到快乐的不行~ 我们java也有异步,用起来比他们还快乐~ 我们biaji一个注(gǒupí)解(gāoyào),也是快乐风男... 且看下面的栗子: 注 ...

最新文章

  1. conda环境里安装pydot
  2. python画图代码彩虹-python绘制彩虹图
  3. java httpclient put_[工具类-HttpClientUtils]HttpClient之GET PUT DELETE POST
  4. 玩转C#控件-常用控件属性
  5. Android之让手机能识别当前app为浏览器类型的APP
  6. docker使用centos镜像
  7. 智能会议系统(14)---Linphone探索:1 . Linphone官方源码探究
  8. mysql 5.7参数配置_MySQL 5.7-新增配置参数
  9. jQuery实现百度导航li拖放排列效果,即时更新数据库
  10. Q88:全局光照(Global Illumination)——Path Tracing
  11. java 零配置_Spring零配置之@Configuration注解详解
  12. matlab实现图像的拼接,MATLAB实现图像拼接算法(求助)
  13. python通过pyserial读写串口
  14. 【Linux】 Debian 系 Linux 安装搜狗输入法
  15. 红外热成像技术的应用与发展
  16. 服务器安全-避免被攻击者查到服务器源 IP与对攻击者ID信息收集
  17. 软件架构模式 mark Richards - 读后总结 6 - 整合
  18. 有参构造方法的作用和无参构造方法的作用
  19. python练习实例——字母图形
  20. 邮箱安全再成热点 金笛企业邮件系统保障企业用户通信安全

热门文章

  1. 机器学习:决策树(Decision Tree)--ID3算法
  2. 前端相关知识(html)
  3. 你可曾拥有过存钱罐(迭代器模式)
  4. php正则表达式验证必须包含数字、字母、特殊符号任意两种组合
  5. xlrd方法excel
  6. openstack基于CEPH的共享盘实现方案
  7. 用USB无线网卡在新平台全新移植并构建Linux无线网络
  8. 老前辈分享:使用python-opencv读取视频,计算视频总帧数及FPS的实现
  9. 基于c++的简易web服务器搭建(初尝socket编程)
  10. ntp校时 linux,linux ntp校时服务器