Description

Input

共一行包括两个正整数N和M。

Output

共一行为所求表达式的值对10^9+7取模的值。

特判m=1

m≠1时:

设S[u]=sigma(i^u*m^i)

m*S[u]=sigma(i^u*m^(i+1))

=sigma((i-1)^u*m^i)+n^u*m^(n+1)

两式相减得(m-1)*S[u]=n^u*m^(n+1)-sigma((i^u-(i-1)^u)*m^i)

S[u]=(n^u*m^(n+1)-sigma((i^u-(i-1)^u)*m^i))/(m-1)

i^u-(i-1)^u可以展开,从而由S[0..u-1]计算出S[u],预处理二项式系数(组合数)即可

边界条件S[0]=sigma(m^i)=(m^n-1)*m/(m-1)

除法要取逆元

时间复杂度为O(m2logn)

#include<cstdio>
typedef long long lint;
const int P=;
lint f[][];
lint s[];
bool d[];
int n,m;
lint power(lint x,lint t){
lint v=,c=x;
while(t){
if(t&)v=v*c%P;
c=c*c%P;
t>>=;
}
return v;
}
lint div(lint a,lint b){
return a*power(b,P-)%P;
}
lint S(int m1){
if(d[m1])return s[m1];
lint v=power(n,m1)*power(m,n+)%P;
for(int i=m1-,j=-;i>=;i--,j=-j){
lint r=S(i)*f[m1+][i+]*j;
v+=r;
v%=P;
}
v=div(v,m-);
d[m1]=;
return s[m1]=v;
}
int main(){
scanf("%d%d",&n,&m);
if(m==){
printf("%lld",n*1ll*(n+)/%P);
return ;
}
f[][]=;
d[]=;
s[]=div(power(m,n)-,m-)*m%P;
for(int i=;i<=m+;i++){
for(int j=;j<=i;j++)f[i][j]=(f[i-][j]+f[i-][j-])%P;
}
printf("%lld\n",(S(m)+P)%P);
return ;
}

最新文章

  1. Freemarker中空值 null的处理++++定义数组
  2. CocoaPod问题
  3. 苹果手机 微信调用百度地图Javascript API 频繁闪退问题
  4. AUTH过程
  5. STM32 枚举类型和结构体的使用
  6. winform最小化到托盘
  7. Java虚拟机几个命令行参数说明
  8. gSoap客户端示例程序
  9. JavaScript异步编程
  10. java设计模式---桥接模式
  11. Java 环境下载设置
  12. 安利一个刚考过的信息安全认证Security+
  13. 和系统运行状况相关的Shell命令总结
  14. day8--socket回顾
  15. gitlab 集成Jenkins
  16. oracle 12c 官方文档 及软件下载
  17. (转)使用异步Python 3.6和Redis编写快速应用程序
  18. [转] Linux Daemon Writing HOWTO
  19. C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
  20. VC dimension and Model complexity

热门文章

  1. MS14-021: Internet Explorer 安全更新: 2014 年 5 月 1 日
  2. Dll封装dll,并且调用该封装的dll
  3. css汇总
  4. Foundation--结构体
  5. Linux服务器没有GUI的情况下使用matplotlib绘图
  6. Java第八次作业--数据库编程
  7. ORACLE常用系统查询
  8. 在MNIST数据集,实现多个功能的tensorflow程序
  9. android中的两种上下文区别
  10. 2018CCPC女生赛(树上莫队)