分析

考虑对 质因数分解,并将提取成的最简形式。
如果要满足,对于任意一个而言,化简后都带有

于是问题被转化成能被表示为多少种个数的和,其中可以有

也即个苹果放在个篮子里有多少种放法。

此处可用dp解, 表示个苹果放在个篮子里方法总数。

转移方程为

应牛友要求详细解释一下:

把5个苹果放进2个篮子里,我们已经知道了五个苹果放进一个篮子里有多少种方法,那么现在多出来了一个篮子,考虑篮子不空的情况,先把所有的篮子都放一个苹果,然后再加上3个苹果放进两个篮子里的方案数量。

也就是说对于空了篮子的方案是一个篮子都不空的方案。无论空多少个篮子呢,都包含在里面:这里是类似递归的理解,空一个篮子里包含了空一个篮子里的空一个篮子。

solution

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
const ll mod = 998244353;
const int maxn = 1005;
ll dp[maxn][maxn];
ll f(ll n, ll m){  // m个苹果 n个篮子
    dp[0][0] = 1;
    for (int i = 1; i <= n; ++i)
        for (int j = 0; j <= m; ++j)
            if (j >= i)  dp[i][j] = (dp[i][j - i] + dp[i - 1][j]) % mod;
            else dp[i][j] = dp[j][j];
    return dp[n][m];
}
int main() {
    int n, m;
    cin >> n >> m;
    ll a = 1;
    for(ll i=2;i*i<=m;++i)
        while(m%(i*i)==0)a*=i,m/=(i*i);
    cout << f(n,a) << endl;
    return 0;
}