1. 递推

inv[1]=1;for(int i=2;i<MAX;i++)inv[i]=(p-p/i)*inv[p%i]%p;

2.阶乘逆元

inv[0]=inv[1]=inv_fac[0]=fac[0]=1;
rep(i,2,maxn) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
rep(i,1,maxn) fac[i]=fac[i-1]*i%mod;
rep(i,1,maxn) inv_fac[i]=inv_fac[i-1]*inv[i]%mod;

3.素数分解

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

inline ll mul_64(ll x,ll y,ll c){return (x*y-(ll)((long double)x/c*y)*c+c)%c;}

class Miller{
public:
    bool miller(ll n, int p) {
        static ll power[70];
        ll x = n - 1;
        int maxk = 0;
        for(ll k = x; k; k >>= 1)++ maxk;
        power[maxk + 1] = 1;
        for(int k = maxk; k >= 0; k --) {
            power[k] = mul_64(power[k + 1], power[k + 1], n);
            if(x >> k & 1)power[k] = mul_64(power[k], p, n);
        }
        if(power[0] != 1) return 0;
        for(int k = 1; !(x & 1); k ++) {
            x >>= 1;
            if(power[k] == n - 1) return 1;
            if(power[k] != 1) return 0;
        }
        return 1;
    }
    int pr[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
    bool prime(ll n) {
        for(int i = 0; i < 9; i ++)
            if(n == pr[i]) return 1;
        for(int i = 0; i < 9; i ++)
            if(!miller(n, pr[i])) return 0;
        return 1;
    }
}P;


ll fac[70],len[70],cnt=0;
class Pollard_rho{
public:
    ll pollard_rho(ll n,ll c){
        ll k=2,x=rand()%(n-1)+1;
        ll y=x,i=1;
        while(1){
            i++;x=(mul_64(x,x,n)+c)%n;
            ll d=__gcd((y-x+n)%n,n);
            if(1<d&&d<n)return d;
            if(x==y)return n;
            if(k==i)y=x,k<<=1;
        }
    }
    void find(ll n,int c){
        if(n==1)return ;
        if(P.prime(n))return fac[cnt++]=n,void();
        ll p=n,k=c;
        while(p>=n)p=pollard_rho(p,c--);
        find(p,k);find(n/p,k);
    }
}Q;

vector<ll>dis;
void dfs(ll res,int pos){
    if(pos>=cnt){
        dis.push_back(res);
        return;
    }
    ll x=1;
    dfs(res,pos+1);
    for(int i=0;i<len[pos];i++){
        x*=fac[pos];
        dfs(res*x,pos+1);
    }
}

int main(){
    ll n;
    while(~scanf("%lld",&n)){
        cnt=0;len[0]=1;int k=1;
        dis.clear();
        Q.find(n,120);
        sort(fac,fac+cnt);
        for(int i=1;i<cnt;i++){
            if(fac[i]==fac[i-1])++len[k-1];
            else len[k]=1,fac[k++]=fac[i];
        }
        cnt=k;
        for(int i=0;i<cnt;i++)cout<<fac[i]<<" "<<len[i]<<endl;
        dfs(1,0);
        for(int i=0;i<dis.size();i++)cout<<dis[i]<<" ";
        puts("");
    }
}