bzoj3157 3516 国王奇遇记
2024-09-24 06:54:33
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 ;
}
最新文章
- Freemarker中空值 null的处理++++定义数组
- CocoaPod问题
- 苹果手机 微信调用百度地图Javascript API 频繁闪退问题
- AUTH过程
- STM32 枚举类型和结构体的使用
- winform最小化到托盘
- Java虚拟机几个命令行参数说明
- gSoap客户端示例程序
- JavaScript异步编程
- java设计模式---桥接模式
- Java 环境下载设置
- 安利一个刚考过的信息安全认证Security+
- 和系统运行状况相关的Shell命令总结
- day8--socket回顾
- gitlab 集成Jenkins
- oracle 12c 官方文档 及软件下载
- (转)使用异步Python 3.6和Redis编写快速应用程序
- [转] Linux Daemon Writing HOWTO
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- VC dimension and Model complexity