jzoj5813
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的更多相关文章
随机推荐
- SpringMVC @RequestBody请求参数在postman中的请求
使用SpringMVC框架,controller使用参数 @RequestBody LoginReq req 注解方式模拟http请求 需要请求header添加一个参数 设置 Header参 ...
- push和pop指令的使用
- 2015年传智播客JavaEE 第168期就业班视频教程day45-ERP项目-0107-其他子系统
一套ERP系统中一定会有CRM,不可能说我所有数据都是散着放的,你想用就随便写一个.你出去和人聊,一定得说我这里有什么有什么,然后你就可以和人说你做的是进销存.人家要问CRM或者说财务系统你就说那不是 ...
- Python any() 函数
Python any() 函数 Python 内置函数 描述 any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 ...
- PHP里的进制
1.进制转换函数: <?php function decto_bin($datalist,$bin) { static $arr=array(0,1,2,3,4,5,6,7,8,9,'A','B ...
- 转载《Spring AOP中pointcut expression表达式解析 及匹配多个条件》
原文地址:https://www.cnblogs.com/rainy-shurun/p/5195439.html 原文 Pointcut 是指那些方法需要被执行"AOP",是由&q ...
- memcached的常用命令
memcached 常用命令及使用说明 1.启动Memcache 常用参数 -p <num> 设置TCP端口号(默认设置为: 11211) -U <num> UDP监听端口 ...
- Mybatis之整体描述
Mybatis在我看来最大的用处就是封装了jdbc,设置参数操作和获取解析结果集.同时控制了数据库链接等操作,大部分采用了反射来映射javabean对象来进行数据库操作. 1.接下来先整体介绍下主要的 ...
- 如何用word文档在博客里发表文章
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- OpenGl中的Nurbs B样条曲面的封装的GLU的NURBS的接口
OpenGl中的Nurbs B样条曲面的封装的GLU的NURBS的接口 创建一个NURBS对象: GLUnurbs* gluNewNurbsRenderer (void); //创建一个NURBS对象 ...