tj:可以知道,隨意構造一個數列x,且x的第i位被n整除的方案是(約數個數)^2m,因為所有數可以隨便選,只要這個數能被n整除即可,方案為約數個數

設一個合法數列a的f值為x,則x小於n^m

假設所有數都取到n,則式子的值為n^(2m)。

我們可以另外構造一個數列a2,其每一個數的值為(n/a1,n/a2…..n/am*2)。

則這個數列的f值為n^(2m)/x。這個值大於n^m

所以可以知道每一個a小於n^m的情況都對應著一種a大於n^m的情況

設f值小於,等於,大於n^m的數列個數為a,b,c

則有a==c 且a+b+c==(約數個數)^2m

題目要求a+b的值,但是a不知道

如果我們求出f的值==n^m的情況,要比求出f的值小於n^m的情況要簡單的多,所以我們可以選擇求出f的值==n^m的情況

也就是說,我們求出b,有2*a=(約數個數)^2m-b,a=((約數個數)^2m-b)/2,a+b=((約數個數)^2m+b)/2,這樣子可以很快的計算出答案a+b

所以,本題實質上是要求出數列(a1,a2,……am*2)==n^m的方案

對於n的每一個因子,可以分開考慮,在結束以後再把所有方案乘起來

設現在要處理的因子為x,在n中有y個,那麼n^m中有m*y個

則問題轉化為了下面一個形式:

有2*m個不同籃子,m*y個蘋果,每一個籃子可以放0至y個蘋果,問有多少種方法,蘋果必須放完

可以dp,設f[i][j]表示在第i個籃子,當前放了j個蘋果的方案

則f[i][j]=sigma(f[i-1][j-k]),且(0<=k<=y),i<=m,j<=k,每一個狀態枚舉在當前的籃子裡放多少個蘋果

初值f[0][0]=1,最終將所有f[2*m][m*y]乘起來就是s2

再套用原來的公式可以得到答案

代碼

#include<bits/stdc++.h>
using namespace std;
#define mo 998244353
typedef long long ll;
ll n,m,f[210][4010],ans=1;
ll qp(ll x,ll y){
    if(!y)return 1;
    if(y==1)return x%mo;
    ll r=qp(x,y>>1)%mo;
    if(y%2==0)return r*r%mo;
    else return r*r%mo*x%mo;
}
void cal(ll &x,ll y){
    ll ct=0;
    while(x%y==0){
        x/=y;
        ct++;
    }
    memset(f,0,sizeof(f));
    f[0][0]=1;
    for(ll i=1;i<=m*2;i++)
        for(ll j=0;j<=ct*m;j++)
            for(ll k=0;k<=min(ct,j);k++)
                f[i][j]=(f[i][j]+f[i-1][j-k])%mo;
    ans=(ans*f[2*m][ct*m])%mo;
}
int main(){
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    ll rt=sqrt(n),ct=0,tp=n;
    for(ll i=1;i<=rt;i++)
        if(n%i==0)ct+=(i*i==n?1:2);
    for(ll i=2;i<=rt;i++)
        if(tp%i==0)cal(tp,i);
    if(tp>1)cal(tp,tp);
    ct=qp(ct,m*2);
    printf("%lld",(ct+ans)*qp(2,mo-2)%mo);
}

jzoj5813的更多相关文章

随机推荐

  1. 使用heroku创建应用时报错 heroku does not appear to be a git repository

    在跟着heroku的官方教程创建python应用时,到deploy-the-app这一步,要上传代码到heroku 的git仓库时,报的这个错误: 网上一搜,相关的答案居然极少,首页只出现一篇(还好这 ...

  2. python实现测试报告的bug统计

    背景:组内要针对每个项目生成测试报告,要对当前项目的一些bug进行统计.考虑到人工统计比较繁琐,而且是个长期的工作,所以写个脚本对bug进行自动统计.(我们用的bug平台是bugfree,直接可以导出 ...

  3. linux 安装php7 Nginx

    这里 记录下 本屌安装linux  下安装php7 即遇到的问题. wget http://cn2.php.NET/distributions/php-7.0.4.tar.gz tar zxvf ph ...

  4. spring定时任务执行两次的原因与解决方法

    spring定时任务,本地执行一次,放到服务器上后,每次执行时会执行两次,原因及解决办法. http://blog.csdn.net/yaobengen/article/details/7031266 ...

  5. SetupDiEnumDeviceInfo

    BOOLEANSetupDiEnumDeviceInfo(IN HDEVINFO DeviceInfoSet,IN DWORD MemberIndex,OUT PSP_DEVINFO_DATA Dev ...

  6. UCI数据

    http://archive.ics.uci.edu/ml/datasets.html?format=&task=&att=&area=&numAtt=&num ...

  7. marathon的高可用服务自动发现和负载均衡

    上一篇我们说谈了docker+zookeeper+mesos+marathon集群,本篇我们来谈谈marathon的集群和自动发现服务. marathon的服务自动发现和负载均衡有两种,1是mesos ...

  8. 递归,回溯和DFS的区别

    递归是一种算法结构,回溯是一种算法思想一个递归就是在函数中调用函数本身来解决问题回溯就是通过不同的尝试来生成问题的解,有点类似于穷举,但是和穷举不同的是回溯会“剪枝”,意思就是对已经知道错误的结果没必 ...

  9. Linux 基础教程 42-xargs命令

        xargs是execute arguments的缩写,主要作用是从标准输入中读取内容,并将此内容传递给它要协助的命令,并作为要协助命令的参数来执行. 基本语法 xargs [选项] [命令] ...

  10. sun.misc.BASE64Decoder的风险

    问题描述 最近需要使用Base64上传图片,但是返现sun.misc.BASE64Decoder 为已经过期的包,此包为以前sun公司的内部包,可以下载此包,但是不利于现在Maven方式构建,可能会在 ...