descripition

Data Constraint

想法
- 这题一看很神仙,只会暴搜这题一看很神仙,只会暴搜
- 假设现在的数组x满足i∀[1..2m],xi∈Z+,xi|n假设现在的数组x满足i∀[1..2m],xi∈Z+,xi|n
- 然后就是找结论,如果集合f(x)=∏2mi=1xi<nm然后就是找结论,如果集合f(x)=∏i=12mxi<nm
-那么集合f(x′)==∏2mi=1n/xi>nm那么集合f(x′)==∏i=12mn/xi>nm - 显然,f(x)×f(x′)=n2m显然,f(x)×f(x′)=n2m
- 所以现在令s1为∏2mi=1xi<nm的方案数,s2为∏2mi=1xi=nm所以现在令s1为∏i=12mxi<nm的方案数,s2为∏i=12mxi=nm
- s3为∏2mi=1xi>nm的方案数,显然s3=s1s3为∏i=12mxi>nm的方案数,显然s3=s1
- 答案=s1+s2=(s1+s2+s3+s2)÷2答案=s1+s2=(s1+s2+s3+s2)÷2
- s1+s2+s3很好求,就是(n的约数个数)2ms1+s2+s3很好求,就是(n的约数个数)2m
- 考虑求s2考虑求s2
- 对n质因数分解,可以发现对于每个质数都是相互独立的对n质因数分解,可以发现对于每个质数都是相互独立的
- 设w为n中质数p的质数,aj表示xj中p的指数设w为n中质数p的质数,aj表示xj中p的指数
- 所以∑2mi=1aj=w∗m,i∀[1..2m],ai≤w所以∑i=12maj=w∗m,i∀[1..2m],ai≤w
- 设f[i][j]为做到第i个数,ai的sum为j的方案数设f[i][j]为做到第i个数,ai的sum为j的方案数
- 简单背包即可简单背包即可
using namespace std;
const ll maxM=210,maxK=32,maxS=11,mo=998244353;
ll ans1,n,m,z,ss0,i,sum,ans2,f[maxM][maxK*maxM],
s[maxS][2],l,j,k;
ll ksm(ll x,ll y){
ll k=1,z=x%mo;
while (y){
if (y&1) k=(k*z)%mo;
y>>=1,z=(z*z)%mo;
}
return k;
}
int main(){
freopen("a.in","r",stdin);
// freopen("count.out","w",stdout);
scanf("%lld%lld",&n,&m);
z=floor(sqrt(n));
fo(i,2,n){
if (n%i==0){
s[++ss0][0]=i;
while (n%i==0){
n/=i,s[ss0][1]++;
}
}
if (n==1) break;
}
sum=1;
fo(i,1,ss0)
sum=(sum*(s[i][1]+1))%mo;
ans1=ksm(sum,2*m);
ans2=1;
fo(i,1,ss0){
memset(f,0,sizeof(f));
f[0][0]=1;
fo(j,0,2*m-1){
fo(k,0,m*s[i][1])
if (f[j][k]){
fo(l,0,s[i][1])
f[j+1][k+l]=(f[j+1][k+l]+f[j][k])%mo;
}
}
ans2=(ans2*f[2*m][m*s[i][1]])%mo;
}
ans1=(ans1+ans2)%mo;
ans2=ksm(2,mo-2);
ans1=(ans1*ans2)%mo;
printf("%lld\n",ans1);
}