- 递推
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("");
}
}