5813. 【NOIP提高A组模拟2018.8.14】 计算 (结论+背包)

descripition

这里写图片描述

Data Constraint

这里写图片描述

想法

  • 这 题 一 看 很 神 仙 , 只 会 暴 搜
  • xi[1..2m],xiZ+,xi|n 假 设 现 在 的 数 组 x 满 足 i ∀ [ 1..2 m ] , x i ∈ Z + , x i | n
  • f(x)=2mi=1xi<nm 然 后 就 是 找 结 论 , 如 果 集 合 f ( x ) = ∏ i = 1 2 m x i < n m
    - f(x)==2mi=1n/xi>nm 那 么 集 合 f ( x ′ ) == ∏ i = 1 2 m n / x i > n m
  • f(x)×f(x)=n2m 显 然 , f ( x ) × f ( x ′ ) = n 2 m
  • s12mi=1xi<nms22mi=1xi=nm 所 以 现 在 令 s 1 为 ∏ i = 1 2 m x i < n m 的 方 案 数 , s 2 为 ∏ i = 1 2 m x i = n m
  • s32mi=1xi>nms3=s1 s 3 为 ∏ i = 1 2 m x i > n m 的 方 案 数 , 显 然 s 3 = s 1
  • =s1+s2=(s1+s2+s3+s2)÷2 答 案 = s 1 + s 2 = ( s 1 + s 2 + s 3 + s 2 ) ÷ 2
  • s1+s2+s3,(n)2m s 1 + s 2 + s 3 很 好 求 , 就 是 ( n 的 约 数 个 数 ) 2 m
  • s2 考 虑 求 s 2
  • n 对 n 质 因 数 分 解 , 可 以 发 现 对 于 每 个 质 数 都 是 相 互 独 立 的
  • wnpajxjp 设 w 为 n 中 质 数 p 的 质 数 , a j 表 示 x j 中 p 的 指 数
  • 2mi=1aj=wm,i[1..2m],aiw 所 以 ∑ i = 1 2 m a j = w ∗ m , i ∀ [ 1..2 m ] , a i ≤ w
  • f[i][j]iaisumj 设 f [ i ] [ j ] 为 做 到 第 i 个 数 , a i 的 s u m 为 j 的 方 案 数
  • 简 单 背 包 即 可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define ll long long
#define fo(i,a,b) for(i=a;i<=b;i++) 
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);

} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值