只能考虑枚举值来数序列。
固定一个 , 和 分别选 左右两边最大的数。所以全局最大值一定被选中,不妨设全局最大值第一次出现的位置 ,剩下的都是简化版本。
一定可以作为 或 出现。如果 是 ,那么 一定是 的最大值。否则 一定是 的最大值。所以枚举最大值 ,最大值第一次出现位置 左边的最大值 ,右边除 的最大值 , 需要满足 。数量 大概就 左右。
先枚举 ,左边方案数 ;再枚举 第一次出现位置 ,右边方案数 ;最后 。
总之枚举 是要求形如 。若 ,则为 ;否则相当于 的等比数列求和 。
把 算了之后枚举 左右两边依然形如 。但 ,即算 时 时,式子形如 。判掉 ,同样是 ,最后是 。
但是对于 的时候涉及到 有点问题,直接暴力。
int n,m,lim,ans;
int calc(int v1,int v2,int n){
if(v1==v2)return (n+1)*ksm(v1,n)%mod;
if(v1<v2)swap(v1,v2);
return (ksm(v1,n+1)+mod-ksm(v2,n+1))*ksm(v1-v2)%mod;
}
int calc1(int v1,int v2,int n){
if(v1==v2)return n*(n+1)/2%mod*ksm(v1,n)%mod;
return (n*ksm(v1,n+1)+mod-(n+1)*ksm(v1,n)%mod*v2%mod+v1*ksm(v2,n))%mod*ksm((v1-v2)*(v1-v2)%mod)%mod;
}
void work(){
n=read();m=read(),lim=read();
for(int i=1;i<=m;i++){
for(int j=1;j<i&&i*j<=lim;j++){
for(int k=1;k<=i&&i*j+k<=lim&&i*k<=lim;k++){
int v=min(k,lim-i*k);
int t=min(i,lim-i*max(j,k));
if(v==k){
int res=(calc(j,k,n-2)+mod-calc(j-1,k,n-2)+mod-calc(j,k-1,n-2)+calc(j-1,k-1,n-2))%mod;
(ans+=res*t)%=mod;
}
else if(v==k-1){
int res=(calc(j,k-1,n-3)+mod-calc(j-1,k-1,n-3))*(n-2)%mod;
if(n<=5){
for(int p=0;p<=n-3;p++){
int res=(ksm(j,p)+mod-ksm(j-1,p))%mod;
res=res*p%mod*ksm(k-1,n-p-3)%mod;
(ans+=mod-res*t%mod)%=mod;
}
}
else (res+=mod-(calc1(j,k-1,n-3)+mod-calc1(j-1,k-1,n-3))%mod)%=mod;
(ans+=res*t)%=mod;
}
else{
int res=(calc(j,k-1,n-2)+mod-calc(j-1,k-1,n-2)+mod-calc(j,v,n-2)+calc(j-1,v,n-2))%mod*ksm(k-1-v)%mod;
(ans+=res*t)%=mod;
}
}
int res=(ksm(j,n-2)+mod-ksm(j-1,n-2))%mod;
res=res*min(i,lim-i*j)%mod;
(ans+=res)%=mod;
}
}
for(int i=1;i<=m;i++){//a_1=mx
for(int k=1;k<=i&&i*k<=lim;k++){
int v=min(k,lim-i*k);
int t=min(i,lim-i*k);
int res=1;
if(v==k)res=res*(ksm(k,n-2)+mod-ksm(k-1,n-2))%mod;
else if(v==k-1)res=res*(n-2)%mod*ksm(k-1,n-3)%mod;
else res=res*(ksm(k-1,n-2)+mod-ksm(v,n-2))%mod*ksm(k-1-v)%mod;
(ans+=res*t)%=mod;
}
}
for(int i=1;i<=m;i++){//a_n=mx
if(i*i+i+1<=lim){
int x=min(m,lim-i*i)-i;
int res=(ksm(i,n-1)+mod-ksm(i-1,n-1)+mod-(n-1)*ksm(i-1,n-2)%mod)%mod;
(ans+=res*x)%=mod;
}
for(int j=1;j<i&&i*j+i+1<=lim;j++){
int x=min(m,lim-i*j)-i;
int res=(n-1)*(ksm(j,n-2)+mod-ksm(j-1,n-2))%mod;
(ans+=res*x)%=mod;
}
}
printf("%lld\n",ans);
}