[2020蓝桥杯B组决赛] C-阶乘的约数

题解

  其实该题考察的就是一个质因数分解,然后进行组合即可。

  证明如下:

       $n=p_1^{\alpha_1} \times p_2^{\alpha_2}  \times ... \times p_k^{\alpha_k}$

       $d=p_1^{\beta_1} \times p_2^{\beta_2}  \times ... \times p_k^{\beta_k}$

  其中 $p_1、p_2、...、p_k$ 全是质数。

       而 $0 \le \beta \le \alpha$,而 $\beta$ 的不同取值对应 $n$ 不同的约数,则 $\beta_1、\beta_2 ... \beta_k$ 总共组合数为 $(\alpha_1 + 1)(\alpha_2 + 1)+...+(\alpha_k + 1)$。

#include <iostream>
using namespace std;

typedef long long LL;
const int N = 1024;
int n;
int p[N], ans;

// 质因数分解 
int main()
{
    cin >> n;
    for (int i = 2; i <= n; ++i) {
        int a = i;
        for (int j = 2; j <= a / j; ++j) {
            if (a % j == 0) {
                while (a % j == 0) {
                    p[j]++;
                    a /= j;
                }
            }
        }
        if (a > 1) p[a]++;
    }
    
    for (int i = 2; i <= n; ++i) {
        if (p[i] > 0) {
            cout << i << " " << p[i] << endl;
        }
    }
    // 溢出风险 
    LL res = 1;
    for (int i = 2; i <= n; ++i) {
        if (p[i] > 0) {
            res = res * (p[i] + 1);
        }
    }
    cout << res << endl;
    return 0;
}

   这一题,y 总讲过,可考试的时候,简单以为是 $2$ 的倍数,呜呜呜~~~,对不起 y 总。

posted @ 2020-11-15 21:03  Fool_one  阅读(987)  评论(0编辑  收藏  举报