题目描述
解法是求出n!和a所有共同的素因数e1=e2;
其中e1的幂p1,e2的幂p2满足p1>=k*p2,找出所有共同素因数中满足条件的最小k;
思想还是挺难想出来的,毕竟不是用数学思维思考的人。。
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int arr[1001];//0未知 1素数 2非素数
int b[1010];//计算a每个素因数的个数
int cnt[1010];//计算n!每个素因数的个数
int main(){
memset(arr, 0, sizeof(arr));
for (int i = 2; i < 1001;i++)
{
if (arr[i] == 1||arr[i]==2)
continue;
else{
//int max = sqrt(i) + 1;
arr[i]=1;
/*for (int j = 2; j < max; j++)
if (i%j == 0)
{
a[i] = 2; break;
}*/
}
if (arr[i] == 1)
{
for (int k = i; k*i <= 1000; k++)
arr[k*i] = 2;
}
}
int n,a;
int j = 0;
while (cin >> n>>a)
{
memset(b, 0, sizeof(b));
memset(cnt, 0, sizeof(cnt));
//对n!分解素因数
for (int j = 2; j < 1001; j++)
{
int r = n;//暂存n值
if (arr[j] == 1)
{
while (r)
{
cnt[j] += r / j;
r = r / j;
}
}
}
int res = 0x1ffffff;
//对a分解素因数
for (int i = 2; i < a; i++)
{
if (arr[i] == 1 && a%i == 0)
{
int tmp = a;
while (tmp%a==0)
{
b[i]++;
tmp = tmp / i;
}
}
if (b[i] == 0)continue;
if (cnt[i] / b[i] < res)
res = cnt[i] / b[i];
}
cout << res << endl;
}
return 0;
}