牛客 - 小V和方程

题目描述

小V和方程

解法:(C++)

考虑把 m \sqrt m m 分解成 a b a\sqrt b ab ,而 b b b 再没有平方因子

那么接下来的工作就是 a a a b \sqrt b b n n n 个位置,具体做法同 洛谷P2386 - 放苹果

怎么分解呢?设 m = i c n t , c n t   i s   o d d m = i^{cnt},cnt\ is\ odd m=icnt,cnt is odd,那么 m = i c n t / 2 = i ( c n t − 1 ) / 2 ⋅ i \sqrt m = i^{cnt/2} = i^{(cnt-1)/2}\cdot \sqrt i m =icnt/2=i(cnt1)/2i m = i c n t , c n t   i s   e v e n m = i^{cnt},cnt\ is\ even m=icnt,cnt is even,那么就相当于若干个 1 \sqrt 1 1 组合,当然在编程上是可以不用区分的

#include 

using namespace std;

const int MOD = 998244353;
const int N = 1005;
int n, m, x, cnt;
int f[N][N];

int main()
{
    cin >> n >> m;
    x = 1;
    for(int i=2;i*i<=m;i++)
    {
        if(m%i) continue;
        cnt = 0;
        while(m%i==0)
        {
            cnt++;
            m /= i;
        }
        for(int j=1;j<=cnt/2;j++) x *= i;
    }
    f[0][0] = 1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=x;j++)
        {
            if(j>=i) f[i][j] = (f[i-1][j]+f[i][j-i])%MOD;
            else f[i][j] = f[j][j];
        }
    }

    cout << f[n][x] << endl;
    return 0;
}

你可能感兴趣的:(题解)