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. unity替换mesh测试
  2. PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version
  3. SQL游标原理和使用方法
  4. 终于也为自己开了技术博客
  5. python网络编程爬虫_Python爬虫--网络编程
  6. CentOS 下的邮件通知
  7. C# 窗体半透明,控件不透明
  8. UILabel实现自适应宽高需要注意的地方(三)
  9. java导入功能超时问题
  10. 32单片机——pwm波输出
  11. 安捷伦仪器仪表 - 程控总结
  12. 元宇宙通证- 九、IT/ICT发展史全景长图
  13. 什么是ARM开发板及其硬件特性介绍
  14. 大四学年个人自我鉴定
  15. 初生牛犊不怕虎!开发不足一年的Android实习生在大厂横冲直撞后,手握多份offer,特此分享!
  16. 苹果电脑双系统正确打开方式,虚拟机已经Out了
  17. 基本概念:节点、集群、分片及副本
  18. 设置PHP的环境变量,区分PHP的测试环境和正式环境【php】
  19. 【机器学习】浅谈正规方程法梯度下降
  20. B+树真的不难,楼下菜大爷都能学得会的B+树!(数据结构可视化神器推荐)

热门文章

  1. ssm+jsp计算机毕业设计奥迪汽车配件网络销售系统8avr0(程序+LW+源码+远程部署)
  2. 【C++】C++11新特性——可变参数模板|function|bind
  3. USB UVC实战笔记第2篇—提取描述符信息
  4. 记一次模拟生成数据发到kafka的bug
  5. (kuangbin带你飞--最短路径)MPI Maelstrom(dijstra模板题)
  6. python数学建模之用scipy.optimize.minimize解决高次非线性规划问题
  7. String 数组转字符串形式
  8. nginx实现跨域访问
  9. Xceed Ultimate Suite 2022.2
  10. java guns框架_guns框架试用笔记