题解:P15985 [PA 2026] 骰子 / Kostki
sun_zags_slowly · · 题解
太难了,不会做。
你首先要了解这个。
好像
思路
为了转移,我们设
期望跳过
此时答案为:
情况 p=1
跳过去的期望步数为
利用等比数列求和公式,可得
此时答案为:
然后就没了。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
#define N 1000005
#define int long long
inline int read(){
int a=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
a=a*10+c-'0';
c=getchar();
}
return a*f;
}
int ksm(int a,int b){
int s=1;
while(b){
if(b&1)s=s*1ll*a%mod;
a=a*1ll*a%mod,b/=2;
}
return s;
}
int n,m,k,pwk;
int s[N],f[N],g[N];
signed main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
n=read(),k=read(),m=read();
pwk=ksm(k,mod-2);
int s1=0;
f[0]=s1=1;
for(int i=1;i<m;i++){
f[i]=s1*1ll*pwk%mod;
(s1+=f[i])%=mod;
if(i-k>=0)(s1+=mod-f[i-k])%=mod;
}
s1=1;
for(int i=1;i<m;i++){
int l=i+1,r=min(m-1,i+k-1);
g[i]=(g[i-1]+mod-(s1-f[i-1]+mod)%mod*1ll*pwk%mod+f[i-1]*1ll*pwk%mod*max(0ll,r-l+1)%mod)%mod;
(s1+=f[i])%=mod;
if(i-k>=0)(s1+=mod-f[i-k])%=mod;
}
int ans=0;
for(int i=0;i<m;i++){
int kk=(f[i]+g[i])%mod;
if(i+k<m)
(ans+=n*1ll*f[i]%mod*ksm(kk,n-1)%mod)%=mod;
else{
int kkk=(i+k-m+1)*1ll*pwk%mod;
(ans+=(ksm(kk,n)+mod-ksm((f[i]*1ll*(mod+1-kkk)%mod+g[i])%mod,n))%mod*1ll*ksm(kkk,mod-2)%mod)%=mod;
}
}
printf("%lld\n",ans);
return 0;
}