思路

我们知道要让这个序列尽量长,那连续数字的商要尽量小,也就是说我们用质因数作为商的话,那么这个序列就最长,所以我们求一次质因数分解就可以求出mm

那么怎么求方案数呢?

假设我们已经知道了,质因数pip_i对应的数量eie_i的话,假设一共kk个质因数,那么方案数就是Cme1Cme1e2C_m^{e_1} * C_{m-e_1}^{e_2} \dots

展开就得到下面的式子

m!ei!\frac{m!}{\prod e_i!}

代码

/**
 *    author: andif
 *    created: 30.07.2023 13:42:23
**/
#include<bits/stdc++.h>
using namespace std;

#define de(x) cerr << #x << " = " << x << endl
#define dd(x) cerr << #x << " = " << x << " "
#define rep(i, a, b) for(int i = a; i < b; ++i)
#define per(i, a, b) for(int i = a; i > b; --i)
#define mt(a, b) memset(a, b, sizeof(a))
#define sz(a) (int)a.size()
#define fi first
#define se second
#define qc ios_base::sync_with_stdio(0);cin.tie(0)
#define eb emplace_back
#define all(a) a.begin(), a.end()
using ll = long long;
using db = double;
using pii = pair<int, int>;
using pdd = pair<db, db>;
using pll = pair<ll, ll>;
using vi = vector<int>;
const db eps = 1e-9;

int main() {
    int t; cin >> t;
    while(t--) {
        int n; cin >> n;
        vi p, e;
        for (int i = 2; i * i <= n; ++i) {
            if (n % i == 0) {
                p.eb(i);
                int c = 0;
                while(n % i == 0) {
                    c++;
                    n /= i;
                }
                e.eb(c);
            }
        }
        if (n != 1) {
            p.eb(n);
            e.eb(1);
        }
        auto f = [&] (int x) {
            ll ret = 1;
            rep(i, 1, x + 1) {
                ret *= i;
            }
            return ret;
        };
        int m = 0;
        rep(i, 0, sz(p)) m += e[i];
        ll fenzi = f(m);
        rep(i, 0, sz(p)) fenzi /= f(e[i]);
        cout << m << " " << fenzi << '\n';
    }
    return 0;
}