一、题目
二、解法
这道题有一个很巧妙的思路,把 n n n质因数分解,我们考虑每一个质因数的情况,最后再合并即可。
对于质因数
p
p
p,设
d
p
[
k
]
[
s
]
dp[k][s]
dp[k][s]为操作
k
k
k次,剩下的次数为
s
s
s的概率,转移如下(
m
m
m是最高次数):
d
p
[
k
]
[
s
]
=
∑
i
=
s
m
d
p
[
k
−
1
]
[
i
]
i
+
1
dp[k][s]=\sum_{i=s}^m\frac{dp[k-1][i]}{i+1}
dp[k][s]=i=s∑mi+1dp[k−1][i]初始化
d
p
[
0
]
[
m
]
=
1
dp[0][m]=1
dp[0][m]=1,然后我们根据期望的定义可以算出这个质因数最后得出的数的期望:
∑
i
=
0
m
d
p
[
k
]
[
i
]
×
p
i
\sum_{i=0}^mdp[k][i]\times p^i
i=0∑mdp[k][i]×pi那么最后我们把所有的质因数的期望求乘积就是
n
n
n最后的期望了,贴个代码
q
w
q
qwq
qwq
#include <cstdio>
#include <cstring>
#define int long long
const int M = 55;
const int jzm = 1e9+7;
int read()
{
int x=0,flag=1;
char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int n,m,k,ans=1,dp[M],inv[M];
void init(int n)
{
inv[0]=inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=inv[jzm%i]*(jzm-jzm/i)%jzm;
}
void solve(int t)
{
int tmp=1,res=0;
memset(dp,0,sizeof dp);dp[m]=1;
for(int i=1;i<=k;i++)
for(int j=0;j<=m;j++)
{
dp[j]=dp[j]*inv[j+1]%jzm;
for(int l=j+1;l<=m;l++)
dp[j]=(dp[j]+dp[l]*inv[l+1])%jzm;
}
for(int i=0;i<=m;i++,tmp=tmp*t%jzm)
res=(res+dp[i]*tmp)%jzm;
ans=(ans*res)%jzm;
}
signed main()
{
init(50);
n=read();k=read();
for(int i=2;i*i<=n;i++)
if(n%i==0)
{
m=0;
while(n%i==0) n/=i,m++;
solve(i);
}
if(n>1) m=1,solve(n);
printf("%d\n",ans);
}