题目描述
给定一个整数 nn,求将 nn 分解为互不相同的不小于 22 的数的乘积的方案数。答案模 998244353998244353。
输入输出格式
输入格式:
第一行一个整数 TT,表示数据组数。
接下来 TT 行,每行一个整数 nn,意义如描述所述。
输出格式:
一共 TT 行,每行一个整数,表示答案。
输入输出样例
输入样例#1:
1
688
输出样例#1:
6
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5,D=998244353;
const ll U=1e12+5;
int a[N],top,T;
ll n;
namespace Hash{
const int T=1e7;
const int D=5780347;
int pre[D] ,val[T],next[T],tot;//首,dp值,后继,总数
ll to[T];
int &get(const ll &x){
for(int i=pre[x%D]; i; i=next[i])
if(to[i]==x)return val[i];
to[++tot]=x;
next[tot]=pre[x%D];
pre[x%D]=tot;
return val[tot];
}
};
int DP(const ll &n,int h) { //n是剩下的数,h是枚举的因子位置
if(h>top) return 1;
int x=a[h];
if(ll(x)*x>=n)
return 1;
int &ans=Hash::get(x*U+n);
if(ans) return ans;
ans=DP(n,h+1);
if(n%x==0) (ans+=DP(n/x,h+1))%=D;
return ans;
}
int main(){
cin>>T;
while(T--){
ll n;
cin>>n;
top=0;
int mi=sqrt(n);
for(int i=2;i<=mi;++i)
if(n%i==0)a[++top]=i;//分解因数
if(!top)puts("0");//质数情况
else cout<<DP(n,1)-1<<endl;
}
return 0;
}