题目
题解思路
相当于对所有质因子进行排列组合,从1开始往右边乘,这样一定满足从右往左边能整除。
AC代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
int vis[1050500];
vector <int> ss;
int main ()
{
ios::sync_with_stdio(false);
vis[1] = 1;
for (int i = 2 ; i <= 1050100 ; i++ )
{
if (!vis[i])
{
ss.push_back(i);
for (int k = 2*i ; k <= 1050100 ; k += i )
{
vis[k] = 1;
}
}
}
int n;
while(~scanf("%d",&n))
{
vector <int> yz;
for (int i = 0 ; i < ss.size() ; i++ )
{
if ( n % ss[i] == 0 )
{
int cnt = 1;
int p = n/ss[i] ;
while( p % ss[i] == 0 )
{
cnt++;
p /=ss[i];
}
yz.push_back(cnt);
}
}
int ans = 0;
for (int i = 0 ; i < yz.size() ; i++ )
ans += yz[i] ;
long long tmp = 1 ;
for (int i = 1 ; i <= ans ; i++ )
tmp*=i;
for (int i = 0 ; i < yz.size() ; i++ )
{
long long t1 = 1;
for (int k = 1 ; k <= yz[i] ; k++ )
{
t1*=k;
}
tmp /= t1;
}
printf("%d% lld\n",ans,tmp);
}
return 0;
}